在使用c#用串口和下位机通信的时候,为了不让io阻塞ui进程,都会新开个线程来处理串口io。在多个线程同时读取串口的情况下,经过测试,需要加锁,否则会出现各种各样奇奇怪怪的运行时异常。SerialPort本身的实现是线程不安全的。

我写了个c#的小程序来测试,用python不断的发送类似于'00\r01\r02\r03\r04\r05\r06\r07\r08\r09\r10\r11\r12\r13\r14\r15\r16\r17\r18\r19\r20\r21\r22\r23\r24\r25\r26\r27\r28\r29\r30\r31\r32\r33\r34\r35\r36\r37\r38\r39\r40\r41\r42\r43\r44\r45\r46\r47\r48\r49\r50\r51\r52\r53\r54\r55\r56\r57\r58\r59\r60\r61\r62\r63\r64\r65\r66\r67\r68\r69\r70\r71\r72\r73\r74\r75\r76\r77\r78\r79\r80\r81\r82\r83\r84\r85\r86\r87\r88\r89'的字符串,以\r作为分界符,让c#开两个线程来同时读同一个串口。

加锁的情况下,读取十分稳定。你拍一我拍一。

 

 不加锁的情况下,serialport的readto方法有时候会发生运行时异常,也有时候会如上图那样,不能正确分割和读取字符串。