Linux 通过串行端口发送一些无符号整数时出错(teensy->;raspi)
我在尝试通过USB在teensy和Raspberry Pi3之间进行通信时遇到了一些问题 当我发送unsigned int时,对于所有包含值13字节的数字,我收到了错误的数字,该字节被更改为值10 例如:Linux 通过串行端口发送一些无符号整数时出错(teensy->;raspi),linux,usb,teensy,Linux,Usb,Teensy,我在尝试通过USB在teensy和Raspberry Pi3之间进行通信时遇到了一些问题 当我发送unsigned int时,对于所有包含值13字节的数字,我收到了错误的数字,该字节被更改为值10 例如: 13 becomes 10; 269 becomes 266; 525 becomes 522; 781 becomes 778; 1037 1034; 1293 1290; 1549 1546; 1805 1802; etc... 但对其他人来说不是 无论我在pi上使用我的程序还是通
13 becomes 10;
269 becomes 266;
525 becomes 522;
781 becomes 778;
1037 1034;
1293 1290;
1549 1546;
1805 1802;
etc...
但对其他人来说不是
无论我在pi上使用我的程序还是通过/dev/ttyACMO
发送cat命令。然而,当我在另一台计算机上做同样的事情时,一切都很好
我在另一台计算机上遇到了同样的问题,所以我认为问题来自于我安装的坏库
你知道吗
注:teensy上的代码非常简单:
unsigned int i = 0;
while(true){
Serial.write((char*) &i, 4);
++i;
delay(500);
}
ASCII十进制10是换行符(
)。ASCII十进制13是卡里格返回值(
)
你很可能是隐性
⇄ <代码>转换;但总而言之,它植根于技术史:
- 当计算机首次获得文本输入/输出功能时,这不是通过显示器实现的,而是电传打字机。电传打字机本质上是一种机械打字机,每个“键”都可以被电信号击中
- 打字机,从而电传打字机区分了将纸张向前推进一行(送行)和将卡纸返回到行首
- ASCII编码本质上是打字机功能到二进制模式的1:1映射
)和一个卡里奇返回(
),两者的顺序并不完全重要,物理效果实际上是相同的
但是,不同的操作系统采用不同的默认约定,即如何存储和传输换行:
- MS-DOS和by继承Windows选择按该顺序显式存储
和 - Unix选择只存储
,并在将其发送到电传打字机时将其转换为
序列,在接收时反之亦然。Linux采用了这个Unix约定
(,)
,期望另一端是电传打字机。这就是,这里可能发生的事情!通过有线传输的实际数据是
,但接收操作系统继承了Unix的方式,将其静默地转换为普通的
。对于任何大于255的数字,这个转换将发生在其低8字节上,同时删除整个字节
当然,可以重新配置此默认行为,即通过打开的串行端口,特别是输出和输入选项标志(即标志OPOST
,ONLCR
,ONLCR
,OCRNL
,ONLRET
,INLCR
,IGNCR
,ICRNL
)
然而,我强烈建议你不要摆弄这些旗帜,而是要牢记以下两点:
- 纯文本是通用交换格式(也就是说,如果可以避免的话,不要通过有线方式提交原始二进制文件,而是将其作为–也是人类可读的–文本发送)
- 在阅读你所收到的东西时要自由;在你发送的内容上要保守(即,编写程序时应确保读取数据不依赖于严格的数据顺序和格式,即可以容忍任何类型的换行符序列或空格分隔字段的数目;但也应以严格的常规方式发送数据,以便不太自由的接收者不会被数据阻塞)