关于串口通讯serialport问题

xiaotiange 2010-08-12 11:52:28
WINFORM程序
循环发送一系列数据 ,按第四位数据从0x20--0x2a循环
发送一条后便会返回相应的数据,所以接收和发送的步调是一致的
但是在接收时窗体显示经常发生 ‘跳位’的情况。比如从20跳到22,25跳到28

用ACCESSPORT监控,一切都是正常的按顺序跑,不存在 ‘跳’的情况
这里有两个timer,一个timer用于改变接收是否完成的标识,一个控制从开端口到发送到接收到显示的主进程timer,
调了几次interval,结果改变不了根本问题
help~!
指点迷津
...全文
168 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
newboy686 2010-10-19
  • 打赏
  • 举报
回复
都是高手, 学习
jsmouse 2010-08-12
  • 打赏
  • 举报
回复
楼主把代码发出来看看!~
你这样描述不好解决,能出现的情况就是楼上所说的两种!~
兔子-顾问 2010-08-12
  • 打赏
  • 举报
回复
这个么。。
首先,数据如果你用其他工具看,没丢,那不会有问题。你自己处理的时候,如果数据量不大,那么也不会因为处理不及时而漏处理,我能想到的就是你多个地方执行了Read。只有你仔细检查代码了。
xiaotiange 2010-08-12
  • 打赏
  • 举报
回复
timer_receive 就是个用来改变读取是否完成标识的timer
xiaotiange 2010-08-12
  • 打赏
  • 举报
回复
只有一个receive事件…… 读完一条后 timer_receive里标识清0 ,timer_receive 也停了
兔子-顾问 2010-08-12
  • 打赏
  • 举报
回复
看你实际怎么做的。比如DataReceived中读取了,Timer中也读取了,或是其他的地方也读取了。时序控制不好就乱了。
xiaotiange 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]

一般是多个地方可以读取数据,彼此“抢”数据了。
[/Quote]
怎么会多个地方读取呢
麻烦详细说下
兔子-顾问 2010-08-12
  • 打赏
  • 举报
回复
一般是多个地方可以读取数据,彼此“抢”数据了。
xiaotiange 2010-08-12
  • 打赏
  • 举报
回复
看来和timer_receive的 interval 有关系 ,关系不小,改到240 ms ,跳的几率变的很小了,但 毕竟还是 存在 ‘跳’咕~~(╯﹏╰)b
xiaotiange 2010-08-12
  • 打赏
  • 举报
回复


public void InitForm()
{

pid = 0;

timermain.Enabled = true;
}





xiaotiange 2010-08-12
  • 打赏
  • 举报
回复
代码好多 有选择的帖出来了

public void MainProcess()
{
switch (pid)
{
case 0://初始化
InitForm();
pid = 1;
break;
case 1:
//保存要发送的数据
case 2:
开串口
case 3:
发送
case 4:

haveRead = 0;
endRead = 0;
pid = 6;
break;
case 5:
if (haveRead == 1)
{
if (timer_receive.Enabled == false)
{
timer_receive.Enabled = true;
timer_receive.Start();
}
}


if (endRead == 1)
{
pid = 7;
}
case 7:
ReveivedProcess();//显示
pid = 1;
break;

}
}
private void spt_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (haveRead == 1)
{
len = spt.BytesToRead;
spt.Read(receive, offset, len);
endRead = 1;

}
else
{
len = spt.BytesToRead;
spt.Read(receive, offset, len);
offset = offset + len;
haveRead = 1;
endRead = 1;

}

}

private void timer_receive_Tick(object sender, EventArgs e)
{

endRead = 1;
timer_receive.Enabled = false;
}

private void timermain_Tick(object sender, EventArgs e)
{
timermain.Enabled = false;
MainProcess();
timermain.Enabled = true;
}

110,534

社区成员

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

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

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