c#串口指令发送周期的问题

xiemeilin 2010-04-15 10:46:19
我要给个仪器发送指令,但是呢这个仪器不太好使,需要满足它的周期才能返回好的数据,不然就会出现乱码,我用早先用LabVIEW做的一个串口程序,指令发送周期是1500ms收到的数据是很好的,没有乱码。
但是我现在用c#来做,却老是收到乱码数据,我设置timer的周期也是1500ms啊,为什么会出现截然不同的结果呢?

private void Device_Load(object sender, EventArgs e)
{
Creatlabel();
Iniform();
timersend.Enabled = false;
if (conf.Openport(serialPort, Comname, boudrate, parity, databit, stopbit))
{
MessageBox.Show("通讯成功");
timersend.Enabled = true;
}

else
{
MessageBox.Show("通讯失败,请检查串口是否被占用?");
}
timersend.Interval = 2000;
}
private void SendCommand()
{
int i;
string sendstr;
for (i = 0; i < Equiment.Length; i++)
{
// RRSTSB0000ZU
sendstr = "RRSTSB" + Equiment[i].PadLeft(4, '0') + "ZU";
serialPort.WriteLine(sendstr);

Delay(2000);
}
}
private void Delay(int mm)
{
DateTime current = DateTime.Now;

while (current.AddMilliseconds(mm) > DateTime.Now)
{
Application.DoEvents();
}
return;
}

我把timer的周期从1000设到2000可是好像一点改善都没有,希望大家帮忙解决下。
难道LabVIEW的时间跟c#的时间概念不一样?
...全文
506 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
soulsteal 2010-04-16
  • 打赏
  • 举报
回复
接收到数据,启动线程,处理数据,同时关闭采集功能,同时开启计时线程
计时时间到,开启采集功能
风中一匹狼 2010-04-16
  • 打赏
  • 举报
回复
乱码是不是 你接收回来的数据没有转换数据类型,应该转换为16进制的啊
xiemeilin 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 leafold 的回复:]

收发数据放在线程中做。
[/Quote]
我想请教下怎么做?我现在就是用sleep来做停顿1s然后再发数据,这样数据也接收完了,出现乱码的现象就少了,基本正常。
soulsteal 2010-04-15
  • 打赏
  • 举报
回复
你第一条返回是正确的么?
你接收到的是什么类型数据,显示的是什么类型数据,这两个类型对了么?
你的波特率设对了么?
xiemeilin 2010-04-15
  • 打赏
  • 举报
回复
就没人回复一下?
suners 2010-04-15
  • 打赏
  • 举报
回复
ooo
xiemeilin 2010-04-15
  • 打赏
  • 举报
回复
乱码就是出现 RRSTSB 0147 0000 0002 C0999 -0000 -0000 0000 0000 0002 C0999 -0000 -0000 0000 0000 0002 C0??-0000 -0000 0000 0000 0004 C0999 -0000 -0000 0000 0000 0005 0002 ZU
一些问号,我用indeof('?')好像不能识别这个?难道这个?是中文状态下的问号
doubleu2005 2010-04-15
  • 打赏
  • 举报
回复
接受数据的code在哪?
leafold 2010-04-15
  • 打赏
  • 举报
回复
收发数据放在线程中做。
xiemeilin 2010-04-15
  • 打赏
  • 举报
回复
现在的问题是,我在发送下一条指令之前停顿1s,然后再发第二条指令,这样就能收到正确的数据,但是这个延时函数占用很大的系统资源。cpu占有50%,但是用System.Threading.Thread.Sleep(1000);的话程序感觉像是给卡住了一样,点其他地方很久才反应过来。
        private void Delay(int mm)
{
DateTime current = DateTime.Now;

while (current.AddMilliseconds(mm) > DateTime.Now)
{
Application.DoEvents();
}
return;
}

这个延时函数效率不太高。
tfzdh 2010-04-15
  • 打赏
  • 举报
回复
关注。
Joe-xXx 2010-04-15
  • 打赏
  • 举报
回复
"需要满足它的周期才能返回好的数据",这句话你经过认真思考了么?

出现乱码的可能是:
1.通讯串口设置不对,一般都是波特率不匹配;
2.接收数据编码不一致;
3.设备发送过来的数据就是乱码的.
xiemeilin 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 leafold 的回复:]

1、查看十六进制的值。
2、一般不用定时接收的方法,可以用定长指令或设定特定的指令头和尾字节。
[/Quote]
那有什么好办法呢?我每天指令之间的间隔是1000ms.
xiemeilin 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 soulsteal 的回复:]

你第一条返回是正确的么?
你接收到的是什么类型数据,显示的是什么类型数据,这两个类型对了么?
你的波特率设对了么?
[/Quote]
每次第一条返回是正确的没有乱码,我的波特率设置的是9600。从第二次开始就会出现乱码,然后我发现加了延时也就是上面那个delay之后cpu占用达到50%。
都是字符类型的数据。
leafold 2010-04-15
  • 打赏
  • 举报
回复
1、查看十六进制的值。
2、一般不用定时接收的方法,可以用定长指令或设定特定的指令头和尾字节。

111,129

社区成员

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

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

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