Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 通过串行端口发送一些无符号整数时出错(teensy->;raspi)_Linux_Usb_Teensy - Fatal编程技术网

Linux 通过串行端口发送一些无符号整数时出错(teensy->;raspi)

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上使用我的程序还是通

我在尝试通过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上使用我的程序还是通过
/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

然而,我强烈建议你不要摆弄这些旗帜,而是要牢记以下两点:

  • 纯文本是通用交换格式(也就是说,如果可以避免的话,不要通过有线方式提交原始二进制文件,而是将其作为–也是人类可读的–文本发送)

  • 在阅读你所收到的东西时要自由;在你发送的内容上要保守(即,编写程序时应确保读取数据不依赖于严格的数据顺序和格式,即可以容忍任何类型的换行符序列或空格分隔字段的数目;但也应以严格的常规方式发送数据,以便不太自由的接收者不会被数据阻塞)

问题已解决:谢谢!