C# 串口通信的问题

a12321321321312321 2011-05-06 04:02:03

private void button_Query_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
byte[] data_temp = new byte[] { 0xaa, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x55, 0x01, 0x00, 0xff, 0xff };
serialPort1.Write(data_temp, 0, data_temp.Length);
//......略

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
int length = serialPort1.BytesToRead;

//......略


正常情况串口应该回发79个字节数组,为什么有时候要收几次才能收到79个字节的数组,大致意思就是说我单击查询按钮
触发button_Query_Click这个事件后,理想情况是serialPort1_DataReceived只触发一次,收到79个字节的数组。但是大部分时候都是serialPort1_DataReceived自动触发了2次以上,比如第一次收到8个字节的数组,第二次收到71个.也或者第一次收到3个字节,第二次收到76字节。
取的断点查看的serialPort1.BytesToRead是79。正常情况int length = serialPort1.BytesToRead; length
求应该就是79,取断点看的length很多时候都不是79,比如是8 、71、3、76之类的

本人嵌入式的小白。求高手解答。。3Q
...全文
158 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinxing71 2011-05-06
  • 打赏
  • 举报
回复
socket通信有个缓冲区的东西,你把缓冲区弄大点,一次发送多点,应该就没有问题了吧。或者你业务上处理下。然后积攒到足够的时候在发送。
wushichao1987 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ponydph 的回复:]

应该和缓冲区有关吧
[/Quote]

大概就是12楼说的这个意思
wushichao1987 2011-05-06
  • 打赏
  • 举报
回复
嵌入式设备先写入自身缓存,缓存满了通过串口输出。

pc端也有一个缓存,到一定值才会触发事件,所以你每次收到的数据可能个数不一定相同的
dfpgb 2011-05-06
  • 打赏
  • 举报
回复
本人嵌入式的小小白白

我觉得很正常啊
serialPort1_DataReceived本来就是会触发N次的啊
是要不断的接收信息的吧 程序要缓存着啊

设置断点后 触发serialPort1_DataReceived后程序暂停了"太久"后面的信息自然全到齐了啊

不是这样吗
ponydph 2011-05-06
  • 打赏
  • 举报
回复
应该和缓冲区有关吧
xiongxyt2 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 f800051235 的回复:]
引用 2 楼 xiaoyuzi 的回复:

串口类有个threshold设置,你如果设置他为79,DataReceived只触发一次
serialPort.ReceivedBytesThreshold = 79


要是长度不一定呢?
[/Quote]

那可不可以先统计个数之后再赋给serialPort.ReceivedBytesThreshold
a12321321321312321 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 perisonchen 的回复:]
波特率问题?
[/Quote]
根本不是那会事,好不好。
perisonchen 2011-05-06
  • 打赏
  • 举报
回复
波特率问题?
a12321321321312321 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bdmh 的回复:]

你跟踪看看是不是发送多次,不行就写个日志,记录一下每次发送多少,收到多少
[/Quote]
我很肯定。serialPort1.Write(data_temp, 0, data_temp.Length);只执行了一次。
a12321321321312321 2011-05-06
  • 打赏
  • 举报
回复
对这种每次接到的字节数一定的,我还好处理,要是每次查询命令返回的字节数组长度都不一样,我该怎么判断?
a12321321321312321 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoyuzi 的回复:]

串口类有个threshold设置,你如果设置他为79,DataReceived只触发一次
serialPort.ReceivedBytesThreshold = 79
[/Quote]

要是长度不一定呢?
hanfeng_st 2011-05-06
  • 打赏
  • 举报
回复

CheckForIllegalCrossThreadCalls = false;

int length = serialPort1.BytesToRead;

//清除接收缓冲区
this.serialPort1.DiscardInBuffer();

//清除发送缓冲区
this.serialPort1.DiscardOutBuffer();
coder_s 2011-05-06
  • 打赏
  • 举报
回复
接受的时候 等待一下sleep 或者 改变接受事件的执行频率,或者做个监听,来专门接受。 我还真没用过这个控件 貌似,以前做过一次 是直接 调用 port 类库里的api 呵呵,尝试下。
bdmh 2011-05-06
  • 打赏
  • 举报
回复
你跟踪看看是不是发送多次,不行就写个日志,记录一下每次发送多少,收到多少
xiaoyuzi 2011-05-06
  • 打赏
  • 举报
回复
串口类有个threshold设置,你如果设置他为79,DataReceived只触发一次
serialPort.ReceivedBytesThreshold = 79
无常名 2011-05-06
  • 打赏
  • 举报
回复
把串口的波特率设高一点试试

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧