Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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
Serial port MBed/Arduino RS-232串行通信问题_Serial Port_Arduino_Mbed - Fatal编程技术网

Serial port MBed/Arduino RS-232串行通信问题

Serial port MBed/Arduino RS-232串行通信问题,serial-port,arduino,mbed,Serial Port,Arduino,Mbed,我正在从一个CAN接口接收消息到我的mBed设备。然后,mBed设备解析信息以串行方式发送到另一个设备。信息按以下格式发送 “xxxxxxxxxxxxxxxx”其中x=十六进制数 接收此消息的另一个设备将接收一分为二的信息(我已在代码中对此进行了说明)。我遇到的问题是,这些消息的格式。。。。。但有时格式会丢失,例如: [1]xxxx< /msg>< msg>xxxxx [2]xxxxxxxx< msg>xxxxxxx [3]< /msg><

我正在从一个CAN接口接收消息到我的mBed设备。然后,mBed设备解析信息以串行方式发送到另一个设备。信息按以下格式发送

xxxxxxxxxxxxxxxx”其中x=十六进制数

接收此消息的另一个设备将接收一分为二的信息(我已在代码中对此进行了说明)。我遇到的问题是,这些消息的格式。。。。。但有时格式会丢失,例如:

[1]xxxx< /msg>< msg>xxxxx
[2]xxxxxxxx< msg>xxxxxxx
[3]< /msg>< msg>xxxxxxxxx
[4]xxx< /msg>< msg>xxxxxx
**Please ignore the space in the msg tag, it was necessary to show on StackOverflow'**
[1]xxxxxxxxx
[2] xxxxxxxxxxxxxxxx
[3] xxxxxxxxx
[4] xxxxxxxxx
**请忽略msg标签中的空格,它必须显示在StackOverflow's上**
mBed上的波特率设置为38400bps。我没有使用任何奇偶校验、停止位、开始位等,因为我不太熟悉它们的工作原理。有谁能帮助我如何在格式上修复此丢失,或者我必须在接收设备中包含代码才能处理此丢失


非常感谢

这是完全正常的,串行端口不够智能,无法识别XML。您必须自己编写代码。基本算法是状态机。声明一个足以存储完整消息的缓冲区。然后:

  • 扔掉你得到的一切直到你得到“
  • 检查您是否获得了
    ,如果没有,请返回状态1
  • 将收到的字节存储在缓冲区中,直到获得“>”为止
  • 检查您是否获得了
    ,如果没有,请返回状态1
  • 处理消息,返回状态1

  • 这可以确保您在打开端口时正确地与总线同步,并且您不关心在一次read()调用中接收多少字节。

    如果您尝试降低波特率,我认为可能会发生接收机处理速度不够快的情况,而此问题是由于串行设备中使用了本地缓冲而产生的。否则,您可能需要编写简单的开始和结束标记以及消息的长度,以便在接收方正确接收。您能向我解释一下降低波特率的作用吗?据我所知,降低波特率只会减少每秒传输的比特数。“我没有使用任何奇偶校验、停止位、开始位等,因为我不太熟悉它们的工作原理。“-然后您应该了解它们是如何工作的,然后相应地设置串行端口。这些属性不是可选参数;它们是正确配置所必需的。除非你不想要可靠的串行通信。您遇到的问题称为消息帧丢失。是的,我知道它无法识别XML,标记只是用于区分消息的开头和结尾。当您提到“声明缓冲区…”时,我假定您的意思是在接收设备上创建缓冲区。据我所知,接收设备上的接收方法被调用两次,以便接收完整的30字节数据。第一个方法大约14个字节,第二个调用剩余16个字节。谢谢你的回复!您将获得的字节数完全不可预测,这在很大程度上取决于时间。倾向于陷入模式,但机器负载更重,或者对代码进行更改,然后它会发生变化。不,该缓冲区必须存在于代码中。只是一个字节数组。“与总线同步”——串行通信链路不是“总线”。问题在于消息帧上的同步。CAN是一条工业总线。没错,但这些消息应该由mBed设备生成,不一定通过CAN总线接收。串行链路的远端会丢失消息帧。OP暗示他不想修改这个“其他设备”。您的答案似乎是针对链接的那个端的一个问题,它并没有CAN接口。