您的位置:首页 > 其它

SerialPort 做winform程序的问题汇总与解决

2013-07-19 15:27 120 查看
这几天用SerialPort取串口数据,NFC打卡通过USB转串口上传ID数据。出现几个问题,记录一下。

1.SerialPort通过DataReceived这个事件机制取数据。

private void DataReceviedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sport = (SerialPort)sender;
int count = sport.BytesToRead;
Byte[] buffer = new Byte[count];
sport.Read(buffer, 0, count);
//取出的buffer就是每次上传的数据。
}


1.1用SerialPort的方法:ReadExisting,这个直接拿到的字符串是乱码。通过上面的buffer再转16进制的字符串就没问题

1.2 刚开始不知道有这个事件,居然自己写死循环的线程去监听,太傻太天真了。

1.3上面的代码调试没问题。但是生成exe运行就出问题了,每次只能取出传上来的一个字节。想了很久都无解,要投降的时候我用MessageBox.Show一下,发现能取出完整数据了。第一直觉一定是线程的问题。慢慢理清:MessageBox.Show把线程挂起,数据传输完整后才输出,之前一定是有第一个字节进来就触发了这个事件。所以我在上面的第二行代码添加了Thread.Sleep(100);让线程睡一下,等数据完整后再往下走。结果真的是我预料中。

1.4 程序启动后上传数据前几次都没问题。突然我进行了其他操作,如打开浏览器,SerialPort就自动关闭了。遇到这个问题刚开始我以为是NFC硬件问题。后来不管了,我强制一个线程轮询:一发现串口关闭了,我就主动打开。

1.5 解决了1.4的问题,又代来新的问题,我程序都关了,线程还在跑。导致串口一直被占用。于是我在FormClosing事件中添加如下:程序一关,什么相关东西都关了。

搞定收工!

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
System.Environment.Exit(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: