首页 新闻 搜索 专区 学院

C#串口通信问题

0
悬赏园豆:100 [已解决问题] 解决于 2013-03-27 10:07

各位大牛们,我在做一个嵌入式项目的上位机部分,涉及到操控下位机并返回信息。

因为是初学者,不知道从何下手。

比如现在一个读卡器的读写问题。UI有3个按钮,分别发送不同指令,下位机根据指令返回信息。我用SerialPort的DataReceive接收时,会发生第一次连接失败,第二次按才成功。后来知道是后台线程不同步了。

 1 public void FICCard_DataReceived(object sender, SerialDataReceivedEventArgs e)
 2         {
 3             if (ComPort.Closing)//如果正在关闭,则退出监听
 4             {
 5                 return;
 6             }
 7             try
 8             {
 9                 this.Invoke((EventHandler)(delegate
10                 {
11                     ComPort.Listening = true;
12                     string buf = ComPort.getInstance().ReadExisting();
13                     result = buf.Replace("\r", "\r\n");
14                 }));
15             }
16             finally
17             {
18                 ComPort.Listening = false;
19             }           
20         }

 

 1 /// <summary>
 2       /// 连接读卡器
 3       /// </summary>
 4       /// <param name="sender"></param>
 5       /// <param name="e"></param>
 6         private void myButton1_Click(object sender, EventArgs e)
 7         {
 8          ComPort.sendData(Order.ic_instruction.ic_connect_order);
 9           if (result == "OK")
10             {
11                 textBox2.Text = "读卡器连接成功";
12                 isConnected = true;
13             }
14             else
15             {
16                 textBox2.Text = "读卡器连接失败,请检查串口。";
17             }
18             result = "";
19         }

后来我改成不用串口的监听事件,发送后sleep(100)然后直接读取,这种情况下成功了。

不过好像这种方法不是很好吧。

还有个问题:如果用户连续点击多个按钮,发送很多指令时,这时候怎么处理。

可以发个大点的案例给我看看吗?

hjx595的主页 hjx595 | 初学一级 | 园豆:89
提问于:2013-03-22 16:26
< >
分享
最佳答案
0

以我经验是你最好联系硬件生产厂商,记他们提供一个demo.你根据demo修改成你需要的东西 ;另外,你发送完成后,一直监听就行了;

收获园豆:50
画方软件 | 小虾三级 |园豆:778 | 2013-03-22 21:26

那接收的结果在事件里面判断么?

hjx595 | 园豆:89 (初学一级) | 2013-03-23 08:58

@hjx595: 

事件里的函数尽可能写的短小,以防止因为处理耗时太长导致的阻塞,建议将接受的结果交给一个缓冲区,从而让另一个线程去处理

tnjin | 园豆:252 (菜鸟二级) | 2013-03-27 17:19
其他回答(1)
0

你的dataReceive函数是不是没有注册,所以你不会接收到数据?

假定你的串口对象即SerialPort叫做 sp,添加如下代码,则会在接收数据时自动调用sp_DataReceived函数

 sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);

这样就自动开启多线程了啊

收获园豆:50
tnjin | 园豆:252 (菜鸟二级) | 2013-03-24 17:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册