C#通过串口读取仪器的测试状态(测试完成或未完成)很慢

sara_cao 2011-07-27 10:36:11
我在写个c#程序,通过串口控制一台仪器进行如下操作: 开始测试--》读取测试结果 --》 通过测试结果,将结果Pass/Fail传送给电脑。
具体的说,我先让仪器开始测试(发送命令“TEST”),然后会去读取仪器的当时状态(发送“*opc?”),即询问仪器是否完成测试(返回字符串中有1则表示测试完成,有0表示测试正在进行中),如果未完成,则继续去读状态,反之如果完成测试,我接下来就要去读取测试结果。
现在问题是,我在读取仪器状态时,运行速度慢的出奇,通常是仪器面板上显示已经完成测试了约30秒后,程序才能读到测试完成的信号。我把代码贴上来,大家帮忙看下啊!
我没有用DataReceived事件来读,直接用ReadExisting()来读的,能读出来,就是很慢,请大家帮忙看下,并提些宝贵意见,谢谢了!
this.serialPort1.WriteLine("TEST"); //开始测试

//判断是否测试结束,测试结束后,仪器会返回1,否则返回0
Boolean IsInProcess = true;
Boolean IsFinish = false;
while (IsInProcess)
{
this.serialPort1.WriteLine("*opc?");
string status = this.serialPort1.ReadExisting();
string[] status1 = status.Split('\n');
if (status1.Length > 1)
{
if (status1[0] == "1" || status1[1] == "1")
{
IsFinish = true;
IsInProcess = false;
}
}
}
...全文
245 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttiimm11 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sara_cao 的回复:]

补充一下,上面这程序,我设了断点后,再单步执行时,是看不出问题的,运行正常。
[/Quote]

如果断电是正常的,那因该是没有延时的问题

this.serialPort1.WriteLine("*opc?");
thread.sleep(200);//在此处添加一个合适的延时看看
string status = this.serialPort1.ReadExisting();
tshtscc 2011-07-28
  • 打赏
  • 举报
回复
mark
KEecho 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sara_cao 的回复:]
引用 5 楼 wuyazhe 的回复:
直接设置NewLine属性为"\r\n"
不用那么自己写等待的,调用
string line = serialPort1.ReadLine();
就可以了,收到回车换行后,继续执行,否则阻塞。

你的听上去不错,呵呵!能不能告诉我怎么设置这个Newline属性?
[/Quote]

comm.NewLine = "\r\n";
comm.RtsEnable = true;
sara_cao 2011-07-28
  • 打赏
  • 举报
回复
谢谢大家的热心回复!万分感谢!!!
我昨天后来修改了下程序,在读取的时候,用ReadTo替代了ReadExisting之后,就快了很多!现在能和仪器面板显示的同步了。

this.serialPort1.WriteLine("TEST");

//判断是否测试结束,测试结束后,仪器会返回1,否则返回0
Boolean IsFinish = false;
string Flag = "\n";
string LeakCurr = string.Empty;
while (true)
{
this.serialPort1.WriteLine("*opc?");
Thread.Sleep(500);
string status = this.serialPort1.ReadTo(Flag);
string[] status1 = status.Split('\n');
if (status1.Length > 0)
{
if(status1[0] == "1")
{
IsFinish = true;
break;
}
}
}
hangrk 2011-07-27
  • 打赏
  • 举报
回复
看不懂呀
sara_cao 2011-07-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyazhe 的回复:]
直接设置NewLine属性为"\r\n"
不用那么自己写等待的,调用
string line = serialPort1.ReadLine();
就可以了,收到回车换行后,继续执行,否则阻塞。
[/Quote]
你的听上去不错,呵呵!能不能告诉我怎么设置这个Newline属性?
兔子-顾问 2011-07-27
  • 打赏
  • 举报
回复
直接设置NewLine属性为"\r\n"
不用那么自己写等待的,调用
string line = serialPort1.ReadLine();
就可以了,收到回车换行后,继续执行,否则阻塞。
sara_cao 2011-07-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gefangliang 的回复:]
this.serialPort1.WriteLine("*opc?");
string status = this.serialPort1.ReadExisting();
这两句耗费资源也不少啊,进行了读写操作。
[/Quote]
因为不知道仪器完成测试具体需要多长时间,所以必须要不断去读取的
心灵彩虹 2011-07-27
  • 打赏
  • 举报
回复
this.serialPort1.WriteLine("*opc?");
string status = this.serialPort1.ReadExisting();
这两句耗费资源也不少啊,进行了读写操作。
心灵彩虹 2011-07-27
  • 打赏
  • 举报
回复
嵌套了多层循环的原因
心灵彩虹 2011-07-27
  • 打赏
  • 举报
回复
首先要编译成功。以后再运行。
sara_cao 2011-07-27
  • 打赏
  • 举报
回复
补充一下,上面这程序,我设了断点后,再单步执行时,是看不出问题的,运行正常。
sara_cao 2011-07-27
  • 打赏
  • 举报
回复
顶一下哦!不要沉了

110,536

社区成员

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

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

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