我正在研究一种通过(虚拟)串口与PC通信的设备.问题是我们偶尔发送的数据被Windows错误地识别为总线鼠标,然后加载"Microsoft Serial Ballpoint"驱动程序并且鼠标指针开始在屏幕上跳转并随机点击.
一些谷歌搜索显示这是串行设备的一个古老而众所周知的问题,其中通常的解决方法是一些注册表黑客攻击来禁用有问题的驱动程序.然而,我们的用户要求很多,而且我宁愿不让我们的应用程序弄乱用户的注册表.特别是当修复程序依赖于Windows版本并且用户可能正在使用总线鼠标时.
相反,我想通过更改我们的协议以避免发送任何可能让我们误认为鼠标的数据来避免此问题.唯一的问题是,我不太确定要避免哪些模式.显然,微软的鼠标协议由四个字节的数据包组成,其中第一个的MSB被设置,而后三个的MSB是明确的.
只发送7位ASCII就足够了吗?有没有其他设备我需要担心被检测到?
所以我在StackOverflow和Google上浏览了搜索结果的页面和页面,我遇到了很少适合资源受限的嵌入式环境(例如ARM)的C/C++ HTTP客户端库.然而,我遇到了很多适合桌面级应用程序的东西.
从本质上讲,我使用简单,易用且方便的API来进行HTTP GET,POST和HEAD调用(支持身份验证,下载恢复和有效负载压缩).如果它具有较小的占用空间(即没有或最小的外部依赖性)并且是开源的(具有许可许可证),那将是理想的.
这是我到目前为止所遇到的一系列清单以及它们不适合的原因 -
那里有没有我不知道的图书馆,或者我最好自己滚动?
事情是这样的,我想用我的 USB 串口刷新我的 stm32 板。我的stm32板带有一块带有CH340的扩展板。
当我将开发板连接到计算机时,我可以使用命令看到该设备lsusb,输出为Bus 001 Device 039: ID 1a86:7523 QinHeng Electronics CH340 serial converter。
ttyUSB但我在路径下找不到该文件/dev。
然后我运行dmesg | grep tty,这是输出:
[1182096.667353] usb 1-9: ch341-uart converter now attached to ttyUSB0
[1182096.729868] audit: type=1130 audit(1637925474.011:3648): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=brltty-device@sys-devices-pci0000:00-0000:00:14.0-usb1-1\x2d9 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
[1182096.800144] audit: type=1130 audit(1637925474.081:3649): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=brltty@-sys-devices-pci0000:00-0000:00:14.0-usb1-1\x2d9 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
[1182096.803145] usb 1-9: usbfs: interface 0 claimed by ch341 while 'brltty' …Run Code Online (Sandbox Code Playgroud) 我有几年的桌面和网络编程经验.我想继续做一些嵌入式系统编程.在询问了最初的问题后,我想知道我应该从哪个硬件/软件IDE开始......
Arduino + Arduino IDE?
Atmel AVR + AVR Studio 4?
飞思卡尔HCS12或Coldfire + CodeWarrior?
Microchip PIC + MPLAB?
ARM Cortex-M3 + ARM RealView/WinARM
或者......没关系?
哪个开发平台最容易学习和编程(考虑到IDE的可用性)?
如果出现问题,哪一个最容易调试?
我的目标是了解"IO端口如何工作,内存限制/要求,包括可能的分页,中断服务程序". 学习一个我稍后会使用的,或者高级概念应该延续到大多数微控制器是否更好?
谢谢!
更新:这个开发工具包是如何开始的?评论?建议?
在另一个帖子中,我被告知在速度和紧凑性方面switch可能比查找表更好.
所以我想了解这个之间的区别:
static void func1(){}
static void func2(){}
typedef enum
{
FUNC1,
FUNC2,
FUNC_COUNT
} state_e;
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
};
void fsm(state_e state)
{
if (state < FUNC_COUNT)
lookUpTable[state]();
else
;// Error handling
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
static void func1(){}
static void func2(){}
void fsm(int state)
{
switch(state)
{
case FUNC1: func1(); break;
case FUNC2: func2(); break;
default: ;// Error handling
}
}
Run Code Online (Sandbox Code Playgroud)
我认为查找表更快,因为编译器尝试在可能的情况下将switch语句转换为跳转表.既然这可能是错的,我想知道为什么!
谢谢你的帮助!
我曾经读到过某些地方模数运算符在小型嵌入式设备(例如没有整数除法指令的8位微控制器)上效率低下.也许有人可以证实这一点,但我认为差异比整数除法运算慢5-10倍.
除了保持计数器变量并在mod点手动溢出到0之外,还有另一种方法吗?
const int FIZZ = 6;
for(int x = 0; x < MAXCOUNT; x++)
{
if(!(x % FIZZ)) print("Fizz\n"); // slow on some systems
}
Run Code Online (Sandbox Code Playgroud)
VS:
我目前正在这样做的方式:
const int FIZZ = 6;
int fizzcount = 1;
for(int x = 1; x < MAXCOUNT; x++)
{
if(fizzcount >= FIZZ)
{
print("Fizz\n");
fizzcount = 0;
}
}
Run Code Online (Sandbox Code Playgroud) 有没有人对以下任何嵌入式TCP/IP堆栈有特别好(或坏)的经验?
我的需求是一个坚固,易于端口的堆栈.代码大小并不十分重要,性能相对重要,但易用性和移植非常重要.
系统可能会使用尚未确定的RTOS,但根据我的经验,大多数堆栈可以在有或没有RTOS的情况下使用.该平台很可能是ARM变体(很可能是ARM7或CM3).
不太关心将堆栈连接到以太网驱动程序,因此这不是选择中的重中之重.
我对从Linux,RTEMS等操作系统中提取堆栈并不十分感兴趣.
我也对Interniche,Micrium等商业产品不感兴趣......
堆栈不需要各种各样的铃声和口哨,不需要IPv6,我不需要任何东西(Web服务器,FTP服务器等).事实上,我可能会只使用UDP,虽然我可以设想一些优先使用TCP的方案.
我错过的其他筹码经验当然也非常有趣.
感谢您的时间和意见.
现在我确信我们都很清楚Linux与Windows桌面的相对优点.但是,我对嵌入式开发世界的了解却少得多.我主要对行业解决方案感兴趣,因此对iPhone或Android不感兴趣,对这两个操作系统更感兴趣.
嵌入式世界中两个平台之间的相对权衡是什么?如果您正在考虑使用自定义硬件,部分自定义操作系统和自定义应用程序为特定项目构建一个框,那么您会选择哪个以及为什么?
我认为Windows CE赢得了工具,Linux在成本和性能方面都获胜.然而,这只是一种猜测.有没有人有这两者的任何事实或经验?
我看到使用全局变量的大多数异议都有意义,因为它们涉及多线程,线程安全等问题.
但是在一个小的,单线程的,非操作系统的情况下,你有什么异议?就我而言,如果重要的话,我正在用"C"编写我的嵌入式系统.我也是该产品的唯一开发人员.
为什么消除全局变量会使我的代码更好?
(在阅读了几个响应之后,我意识到我也应该指出这个系统没有动态内存分配(例如malloc).所有内存都是在编译时静态分配的.)
为什么嵌入式平台开发人员不断尝试C++ exceptions从他们的用户中删除使用SDKs?
例如,Bada SDK为异常使用建议以下解决方法,它看起来格外难看:
result
MyApp::InitTimer()
{
result r = E_SUCCESS;
_pTimer = new Timer;
r = _pTimer->Construct(*this);
if (IsFailed(r))
{
goto CATCH;
}
_pTimer->Start(1000);
if (IsFailed(r))
{
goto CATCH;
}
return r;
CATCH:
return r;
}
Run Code Online (Sandbox Code Playgroud)
这种行为的原因是什么?
据我所知,ARM编译器完全支持C++ exceptions,实际上这不是问题.还有什么?是例外的使用和unwindings上的开销ARM平台真的有那么大花很多时间做这样的解决方法?
也许其他我不知道的东西?
谢谢.
embedded ×10
c ×4
c++ ×3
arduino ×1
arm ×1
avr-studio4 ×1
client ×1
codewarrior ×1
exception ×1
firmware ×1
http ×1
linux ×1
modulo ×1
mouse ×1
networking ×1
overhead ×1
performance ×1
rtos ×1
serial-port ×1
stm32 ×1
tcp ×1
windows ×1
windows-ce ×1