首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言實作序列埠通訊協定與檔案傳輸程式

     編輯:關於C語言

背景與通訊協定設計

在異構系統間進行序列埠通訊時,因 CPU 速度差異導致「錯幀」,發送端速度快於接收端導致「過衝」。為解決此問題,本文採用簡單握手協定:每次僅發送半個位元組(低 4 位)作為資料,高 4 位作為控制資訊:

  • 0x0:新資料半位元組
  • 0x1:重發上次錯誤資料
  • 0x2:檔名結束
  • 0x3:檔案結束

發送端發出一個位元組後等待接收端回送同一位元組作為確認;若一致則發送新資料,否則重發。資料新舊由高 4 位區分。

核心程式架構

程式包含發送檔案、接收檔案、序列埠初始化、讀寫埠、狀態檢查等模組,主流程如下:

main()
  ├─ InitPort(PORT, 231)  // 初始化 COM1,231 = 9600,N,8,1
  ├─ argv[1] == 'S' ? SendFile(argv[2]) : ReceiveFile()
  └─ 錯誤參數處理

關鍵函數解析

發送端核心邏輯 SendFile() / Send()

  • 以二進位模式開啟檔案,逐位元組讀取。
  • 每個位元組拆為低 4 位(ch % 16)與高 4 位(ch / 16)兩次呼叫 Send()。
  • Send() 發送後等待握手信號 ReadPort(),比對不同時在高 4 位置 1(s += 16)重發,直到收到相同回送。
  • 檔案結束連發兩個 0x2E(46)代表 0x3 結束標記。

接收端核心邏輯 ReceiveFile() / Receive()

  • 先呼叫 GetFileName() 解析檔名(高 4 位為 0x2 時結束)。
  • 主迴圈交替呼叫 Receive() 取得高、低半位元組,組合為完整位元組 ch = (G1 % 16) + G2 * 16 寫入檔案。
  • Receive() 內部處理重發邏輯:若收到高 4 位為 0x1,持續回送並重讀直到非重發標記。

硬體存取層 InitPort / SendPort / ReadPort / CheckState

  • 使用 DOS 中斷 int 0x14 操作 UART(8250/16450/16550 相容)。
  • union REGS 配合 int86() 設定 AH/AL/DX 傳遞參數:
    AH=0 初始化、AH=1 發送字元、AH=2 接收字元、AH=3 讀狀態。
  • ReadPort() 輪詢 CheckState() 的 bit 8(資料就緒),支援鍵盤中斷退出。

程式碼片段精華

// 發送單一位元組並等待確認
void Send(int s) {
    int G;
    SendPort(PORT, s);
    G = ReadPort(PORT);
    if (s != G) s += 16;          // 標記重發
    do {
        SendPort(PORT, s);
        G = ReadPort(PORT);
    } while (s != G);
}

// 接收並處理重發
int Receive(int port, int *G) {
    int GM;
    SendPort(port, *G);            // 回送確認
    GM = ReadPort(port);
    if (GM / 16 == 0) return GM;   // 正常新資料
    if (GM / 16 == 1) {            // 重發請求
        do {
            *G = GM;
            SendPort(port, GM);
            GM = ReadPort(port);
        } while (GM / 16 == 1);
    }
    return GM;
}

優化方向

  • 增加逾時重傳機制,避免死等。
  • 引入 CRC/Checksum 強化錯誤偵測。
  • 支援視窗化流控,提高吞吐量。
  • 移植至 Windows API (CreateFile, SetCommState, ReadFile/WriteFile) 或 Linux termios 實現跨平台。

此程式展示了以 C 語言直接操作硬體實作可靠傳輸協定的經典思路,適合嵌入式開發者參考學習。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved