簡體   English   中英

串行通信,使用本機com端口的問題與大量USB->串行

[英]Serial communication, issues using native com port vs prolific usb->serial

如果這是我的代碼有問題還是硬件有問題,我不確定。

我有一個程序可以與某些設備(具體來說是火警控制面板)進行單向通信(僅接收)。編寫該程序時,它是在沒有本地串行端口的PC上完成的,因此我使用了一個多產的serial-> usb加密狗。 在大多數情況下,它都有效。 我偶爾會得到隨機的3F /? 在連接到兩種類型的FACP之一時的數據中,但是我發現那只是轉換器起作用,所以我只是將它們從輸出中剝離了。

然后,我將其移植到了一些帶有本地com端口的戴爾筆記本電腦上。 現在我的數據亂七八糟了(大多數是3F /?。)有時我會看到正確的字符,但是大部分都是廢話。 通常連胡說八道都不正確。 使用多產的轉換器,它可以“工作”,因為我獲得了我期望的所有數據-添加了3F /? 每個字符之間。 如果我去除不良字符,顯示效果很好,但是當其他地方明顯出錯時,這是一個便宜的技巧。

預期數據和接收數據的示例:

//Expected:

FIRE ALARM                     MAGNET    ELEVATOR SHAFT       HOISTWAY    
ELEVATOR SHAFT       Z111   HEAT(fixed)  09:34:19A FRI JUN 06, 2014     L02D041

//Received (approximation, not actual copy/paste as I don't have it on this PC):

F?I?R?E?A?L?R?M??????? ????????M????T????E?LEV?T?R S?H?A?F?T??H?O??S?T?W?A?Y???    
E?E??T???S?H?A?F?T   ?Z1?1?1HEAT(fixed)  0?9?:?34?19??AF?R?I?J???N?6??2?1?4????

我當前的數據檢索方法是通過DataReceivedHandler事件和ReadLine()。 我以前使用過ReadExisting()和ReadByte(),但是結果都是相同的,所以我回到了ReadLine,因為它最適合我接收的數據(80個字符,后跟EOL)

根據制造商和個人經驗,端口設置正確,為9600/8/1 / None / XonXoff。 多產轉換器和本機串行端口在其他程序(例如puTTY,procomm或制造商軟件)中都可​​以正常工作。 有一次,我運行了一個叫做SerialMon的東西來查看它到底發送了什么,而且我得到了同樣亂碼的廢話。 我用它來測試各種端口設置,但無濟於事。

我以前用python編寫了幾乎完全相同的軟件,並且在筆記本電腦的本地com端口和多產的轉換器上都能正常工作。 python軟件和其他終端程序都可以工作的事實使我認為我需要在.NET / C#中修復它。

是的,任何見識都將不勝感激。 序列相關代碼如下。

//declaring
SerialPort com = new SerialPort();       

//opening port
com.PortName = Properties.Settings.Default.com;
com.BaudRate = Properties.Settings.Default.baudrate;
com.Parity = Properties.Settings.Default.parity;
com.StopBits = Properties.Settings.Default.stopbits;
com.DataBits = Properties.Settings.Default.databits;
com.Handshake = Properties.Settings.Default.handshake;
com.Open();

//reading data
buf = com.ReadLine();

TL; DR:串行程序使用大量的2303軟件狗處理某些不良數據。 程序無法使用本機COM端口工作。 同時使用其他程序(putty,procomm等)也可以。 同一台筆記本電腦上的類似Python程序可以在多產和本地com端口上正常工作。 嘗試了其他端口設置,嘗試了端口監視程序。 發送幫助。

編輯:設備以ASCII格式發送數據

感謝您的幫助。 事實證明這是一個奇偶校驗錯誤。 通過用戶屬性分配的串行端口不接受Parity.None,即使強制轉換為Parity類型也是如此。 它默認為Parity.Even(盡管MSDN說None是默認值?)。 我最終要做的是將屬性設置為application,讓用戶在兩個可接受的設置之間切換,而不是自由運行端口設置。 這似乎已經解決了問題,並且我在本機串行端口和轉換器上都沒有奇偶校驗錯誤。

正如Markus所建議的,讓我失望的是將ParityReplace設置為另一個角色。 到那時,很明顯這是一個奇偶錯誤。 我仍然不確定為什么我使用的SerialMon程序即使將奇偶校驗設置為None也能得到相同的結果。

作為參考,在任何時候都不會引發ErrorReceived。

再次感謝大家的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM