首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >串口缓冲区/波特率/丢失数据

串口缓冲区/波特率/丢失数据
EN

Stack Overflow用户
提问于 2012-04-12 03:16:14
回答 1查看 3.3K关注 0票数 2

我使用下面的代码片段每秒钟通过com端口发送gps数据一次:

代码语言:javascript
运行
复制
serialPort = new SerialPort("COM4", 4800, Parity.None, 8, StopBits.One);
serialPort.Handshake = Handshake.None;
serialPort.WriteTimeout = 500;
serialPort.Open();

这一切都很好,但是当使用以下方法写入串口时:

代码语言:javascript
运行
复制
serialPort.Write(theString);

使用theString == 504 charactors我的读取程序,使用:

代码语言:javascript
运行
复制
  while (true) {
      Console.Write(serialPort.ReadExisting());
  }

只会从该写入状态读取数据的254 bytes。同样的情况也发生在腻子上。

我尝试过将写状态拆分为254字节大小的块,并编写两次,但是第二个写操作虽然被我的编写程序确认为运行,但从未被读取器程序读取。

我知道我的写缓冲区是4096 bytes,我的读缓冲区是2048 bytes

我的绳子是:

代码语言:javascript
运行
复制
$GPGGA,191500.00,3351.6474,S,15112.6510,E,2,04,2.5,+0008,M,+020,M,00,0000*76
$GPVTG,057.3,T,,,000.0,N,000.0,K,A*41
$GPRMC,191500.00,A,3351.6474,S,15112.6510,E,000.0,057.3,120412,D*40
$GPGLL,3351.6474,S,15112.6510,E,191500.00,A,A*79
$GPGSA,A,3,,,,,,,,,,,,,2.5,1.3,2.1*34
$GPGSV,1,1,5,03,20,40,89,06,18,30,86,12,25,15,80,20,5,36,70*77
$GPDTM,999,,0.0,S,0.0,E,+0.0,W84*3B
$GPZDA,191500.00,11,04,12*60
$GPGBS,191500.00,+020.0,+020.0,+000.0,,0.00000,+0000.0,0000.0*63
$GPMSS,999,999,200.0,4800,*56

当我尝试使用字符串中的每行写状态写入缓冲区时,它将将所有内容写入缓冲区,但是,两个写操作将在读取器中交错,因此结果如下:

代码语言:javascript
运行
复制
etc...
$GPGGA,191500.00,3351.6474,S,15112.6510,E,2,04,2.5,+0008,M,+020,M,00,0000*76
$GPDTM,999,,0.0,S,0.0,E,+0.0,W84*3B
$GPVTG,057.3,T,,,000.0,N,000.0,K,A*41
$GPZDA,191500.00,11,04,12*60
$GPRMC,191500.00,A,3351.6474,S,15112.6510,E,000.0,057.3,120412,D*40
$GPGBS,191500.00,+020.0,+020.0,+000.0,,0.00000,+0000.0,0000.0*63
$GPGLL,3351.6474,S,15112.6510,E,191500.00,A,A*79
$GPMSS,999,999,200.0,4800,*56
$GPGSA,A,3,,,,,,,,,,,,,2.5,1.3,2.1*34
$GPGSV,1,1,5,03,20,40,89,06,18,30,86,12,25,15,80,20,5,36,70*77
etc...

所有这些对我来说都没有意义,虽然在9600波特速率下不会出现交织问题(我假设是因为4800 baud == 480bytes/s),但改变波特率不是一个选项,而且正常的全球定位系统能够在一个突发中传输所有这些数据。

问题:

有人知道为什么当我将504字节的数据写入流时,我的读取只会接收254字节的数据吗?是否有一些限制

代码语言:javascript
运行
复制
serialPort.Write(Byte[], int offset, int count);

这不允许超过254字节?(这不能解释第二个写操作未完成)。

甚至是。有谁知道有更好的方式写到串口吗?

这种方法似乎适用于所提供的数据(尽管我原来的问题仍然存在):

代码语言:javascript
运行
复制
string Sentence = "";
for (int i = 0; i < block_list[total_block].Count; i+=2) {
    Sentence = block_list[total_block][i] + block_list[total_block][i+1];
    serialPort.Write(Sentence);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-12 03:21:51

等等,您说您使用了一秒超时,但是您的代码是:

代码语言:javascript
运行
复制
serialPort.WriteTimeout = 500;

在发送端是半秒的暂停。而在4.8Kbps (大约为480个字符每秒,如您所述),这仅仅是足够的时间发送约240个字符。

也许全球定位系统可以做到这一点,因为它没有半秒的超时时间。

试着暂停一下,看看会发生什么--5秒应该给你足够的呼吸空间来测试。在4.8Kbps时,504字节需要稍多于一秒才能完成传输。

确定你真的不想和别人握手?缺乏这一点也可能导致数据丢失。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10116919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档