[英]Easiest way to implement a Com Port Terminal. (Windows, C)
我需要編寫一個與COM端口通信的終端,我需要能夠同時從COM-Port和Console發送命令。 (我希望通過兩個無線通信的傳感器節點訪問計算機,所以我仍然需要一種從節點向計算機發送內容的方法)
現在,我已經實現了非重疊串行通信,但我不確定,如何實現“同時發送和接收” - 部分和我只有大約4天的時間來解決問題。 那里沒有太多的信息,所以我歡迎任何有關如何實現最快或最簡單方法的指示。
就我所見,重疊的I / O通信並不完全非常友好。 是否可以使用多線程(僅重疊)執行此操作? 我猜測在那種情況下,我必須每隔幾毫秒讀取緩沖區並為輸入創建一個自己的線程?
是否使用重疊I / O並不是真正的問題:重疊只會為您的程序騰出一些時間。 我編寫了許多這樣的程序,結論總是使用一個線程來處理所有的COM例程。 只要線程處於空閑狀態並執行WaitForMultipleObjects(),此線程是否調用重疊或同步方法就不那么重要了。
我編寫最新COM終端的方式是這個(偽):
thread()
{
while not kill the thread event
{
WaitForMultipleObjects (open port, close port, kill the thread event)
if (open port)
{
send();
receive();
wait_for_send_and_receive();
}
}
}
send()
{
take COM_port mutex
if(there is something to send)
{
copy send_data to local_data, protect this with mutex
WriteFileEx(COM_port,
local_data,
size,
some_overlapped_struct_stuff);
handle errors
}
release COM_port mutex
}
receive()
{
take COM_port mutex
ReadFileEx(COM_port, ...);
handle errors
release COM_port mutex
}
wait_for_send_and_receive()
{
WaitForMultipleObjects (open port,
close port,
kill the thread event,
send done event from send callback routine (overlapped I/O),
receive done event from receive callback routine (overlapped I/O)
);
}
當然,這是一個相當簡單的過程,因為您需要各種功能來打開/關閉COM端口,數據改組等。可能需要幾個突變。
如果它不是公司財產,我會分享真實的,正常工作的生產代碼:( 4天似乎有點樂觀,從我的項目日志來看,我花了幾個月的時間來開發一個工作的COM端口到生產質量水平。單獨的COM端口驅動程序大約是1k loc,全部都有很多Win API調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.