在使用c#用串口和下位机通信的时候,为了不让io阻塞ui进程,都会新开个线程来处理串口io。在多个线程同时读取串口的情况下,经过测试,需要加锁,否则会出现各种各样奇奇怪怪的运行时异常。SerialPort本身的实现是线程不安全的。
我写了个c#的小程序来测试,用python不断的发送类似于'00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89'的字符串,以 作为分界符,让c#开两个线程来同时读同一个串口。
加锁的情况下,读取十分稳定。你拍一我拍一。
不加锁的情况下,serialport的readto方法有时候会发生运行时异常,也有时候会如上图那样,不能正确分割和读取字符串。