簡體   English   中英

實現Com Port Terminal的最簡單方法。 (Windows,C)

[英]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.

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