SerialPort 做winform程序的问题汇总与解决
这几天用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); }