Arduino串行传输丢失一个字符

时间:2015-03-03 04:50:52

标签: memory-management serial-port arduino

我正在使用Arduino Leonardo将字符串传输到wifi模块。 wifi模块可识别的命令格式为:

  

AT60,1,内容到服务器

我正在使用虚拟服务器(TCP / IP Builder)来测试我可以收到的内容。

以下是我要发送的内容:

  

智能/设备/ deviceCmd用户id = 1010002003&安培; DEVICEID = A00019999990002&安培; CMD = ON

由于我一次又一次地尝试发送它,我使用循环发送它。在虚拟服务器端,我得到的内容是:

  

智能/设备/ deviceCmd用户id = 1010002003&安培; devceId = A00019999990002&安培; CMD = ON   智能/设备/ deviceCmd用户id = 1010002003&安培; devceId = A00019999990002&安培; CMD = ON   智能/设备/ deviceCmd用户id = 1010002003&安培; dviceId = A00019999990002&安培; CMD = ON   智能/设备/ deviceCmd用户id = 1010002003&安培; eviceId = A00019999990002&安培; CMD = ON   智能/设备/ deviceCmd用户id = 1010002003&安培; devieId = A00019999990002&安培; CMD = ON   ?智能/设备/ deviceCmd用户id = 1010002003deviceId = A00019999990002&安培; CMD = ON   智能/设备/ deviceCmd用户id = 1010002003&安培; dviceId = A00019999990002&安培; CMD = ON   智能/设备/ deviceCmd用户id = 1010002003&安培; dviceId = A00019999990002&安培; CMD = ON   智能/设备/ deviceCmd用户id = 1010002003&安培; deiceId = A00019999990002&安培; CMD = ON   智能/设备/ deviceCmd用户id = 1010002003&安培; dviceId = A00019999990002&安培; CMD = ON

这是问题:我收到的内容中存在一个可怕的错误,即 deviceId 部分从不纠正即可。这太奇怪了。


以下是相关代码的一部分:

//在Uart.cpp中

//These three lines can sent a formatted string as "AT60,1,content"
Serial1.write("AT60,");
Serial1.write(channelID); //channel ID = 1 here
Serial1.write(reportIsFire, 76);

//在Uart.h中

//Definition of the string I need to send, which has 76 characters.
char reportIsFire[76] = ",smart/device/deviceCmd?userId=1010002003&deviceId=A00019999990002&cmd=ON \n";

以下是此应用程序的几个背景:

  • 我正在使用Arduino 1.5.8 IDE和VisualStudio
  • 由于Arduino的串行缓冲区只有64字节,我已经有了 在" HardwareSerial.h"中将缓冲区大小更改为128字节发送 这个大字符串。
  • 波特率是115200,我使用的是Serial 1.我使用的是Serial 1 传输很少的其他角色,它工作正常。

如果您对此问题有任何了解,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

我打赌Arduino的串行波特率不是100%正确。如果数据由于物理链路中的时序问题而丢失,则增加缓冲区大小无关紧要。

我建议仔细检查初始化串行波特率发生器的代码。通过调整可用设置,改变主时钟速度(如果可能),实现某种形式的流量控制或上述所有方法,可以更接近115,200。

在极端情况下,您可以考虑使用特殊频率振荡器。许多Microchip PIC使用内部或外部4MHz或8MHz晶振,但这对于高速冗长的串行传输会产生太多的定时误差。在这种情况下,可以使用一些特殊的东西,例如7.3728MHz晶体,使精度达到100%(至少在某些PIC器件上。)

最后,另一个考虑因素是设备上是否有任何抢先代码,例如可能无意中干扰串行输出的中断或定时器。

答案 1 :(得分:0)

我没有答案,但我怀疑最有可能的问题是Wifi卡无法以115200的波特率读取字符。如果可能,将Wifi波特率和Arduino Serial.begin()设置为较低的速率,例如57600或19200.

如果Arduino波特率不准确,我希望看到问题出现在字符串中的随机位置,而不是大约40个字符。