串口通信的同步與異步的理解與實現


一、 串口通信的基本原理

    串口通信:按位(bit)發送和接收字節的一種通信方式,其最重要的參數是波特率、數據位、停止位和奇偶校驗位。

    1. 波特率:衡量符號傳輸速率的參數。波特率和距離成反比。

    2. 數據位:衡量通信中實際數據位的參數。實際數據位取決於通信協議。

    3. 停止位:用於表示單個包的最后一位。由於數據是在傳輸線上定時的,並且每一台設備都有自己的時鍾,很可能在通信的兩台設備間出現了一些不同步的情況。它不僅僅是表示傳輸的結束,也是計算機校正時鍾同步的機會。

    4. 奇偶校驗位:在串口通信中是一種檢錯方式。奇、偶、高、低、無。使得接收設備能夠知道一個位的狀態,有機會判斷傳輸與接收數據是否不同步。

二、異步通信和同步通信

1 異步通信

1.1 異步通信的理解

    異步通信采用固定的通信格式,數據以相同的幀格式傳送。每一幀由起始位、數據位、奇偶校驗位和停止位組成。如下圖,每一幀都是由起始位、數據位、奇偶校驗位和停止位組成。

    
    在通信線上沒有數據傳送時處於邏輯“1”狀態。當發送設備發送一個字符數據時,首先發出一個邏輯“0”信號,這個邏輯低電平就是起始位。起始位通過通信線傳向接收設備,當接收設備檢測到這個邏輯低電平后,就開始准備接收數據信號。因此,起始位所起的作用就是表示字符傳送開始。

    起始位后面緊接着的是數據位,它可以是5位、6位、7位、或8位。數據傳送時,低位在前。

    奇偶校驗位用於數據傳送過程中的數據檢錯,數據通信時通信雙方必須約定一致的奇偶校驗方式。就數據傳送而言,奇偶校驗位是冗余位,但它表示數據的一種性質。也有的不要校驗位。

    在奇偶校驗位或數據位后緊接的是停止位,停止位可以是一位、也可以是1.5位或2位。接收端收到停止位后,知道上一字符已傳送完畢,同時,也為接收下一字符作好准備。若停止位后不是緊接着傳送下一個字符,則讓線路保持為“1”。“1”表示空閑位,線路處於等待狀態。存在空閑位是異步通信的特性之一。

1.2 實現異步通信

private static SerialPort sp = null;

private void openCom()
{
    if (sp == null)
    {
        //string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits
        //串口名稱,波特率,校驗位,數據位,停止位
        sp = new SerialPort("COM1", 57600, Parity.Even, 8, StopBits.One);
        sp.ReceivedBytesThreshold = 5; //設置 System.IO.Ports.SerialPort.DataReceived 事件發生前內部輸入緩沖區中的字節數,默認為1。小於或等於零時發生異常
        sp.DataReceived += new SerialDataReceivedEventHandler(readCom);//訂閱委托
    }
    else
    {
        if (sp.IsOpen)
        {
            sp.Close();
            Thread.Sleep(200);
        }
    }
    sp.Open();
}

private void closeCom()
{
    if (sp == null) return;
    if (sp.IsOpen) { sp.Close(); }
}

private void readCom(object sender, SerialDataReceivedEventArgs e)
{
    var reVal = sp.ReadExisting();
    Console.WriteLine(reVal);//接收數據
}

private void writeCom(string comd)
{
    if (sp == null) return;
    if (!sp.IsOpen) { sp.Open(); }
    //Method one for hex
    byte[] hexComd = new ASCIIEncoding().GetBytes(comd);
    sp.Write(hexComd, 0, hexComd.Length);

    //Method two for ascii
    //sp.Write(comd);
}

2 同步通信

2.1 同步通信的理解

    同步通信時,通信雙方共用一個時鍾,這是同步通信區分於異步通信的最顯著的特點。在異步通信中,每個字符要用起始位和停止位作為字符開始和結束的標志,以致占用了時間。所以在數據塊傳送時,為提高通信速度,常去掉這些標志,而采用同步通信。同步通信中,數據開始傳送前用同步字符來指示(常約定1~2個),並由時鍾來實現發送端和接收端的同步,即檢測到規定的同步字符后,下面就連續按順序傳送數據,直到一塊數據傳送完畢。同步傳送時,字符之間沒有間隙,也不要起始位和停止位,僅在數據開始時用同步字符SYNC來指示,如下圖。
    

2.2 實現同步通信

private static SerialPort sp = null;

private void openCom()
{
    if (sp == null)
    {
        //string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits
        //串口名稱,波特率,校驗位,數據位,停止位
        sp = new SerialPort("COM1", 57600, Parity.Even, 8, StopBits.One);
        // 獲取或設置 System.IO.Ports.SerialPort 輸入緩沖區的大小。默認值為 4096。
        sp.ReadBufferSize = 1024;
        //  獲取或設置串行端口輸出緩沖區的大小。默認值為 2048。
        sp.WriteBufferSize = 1024;
    }
    else
    {
        if (sp.IsOpen)
        {
            sp.Close();
            Thread.Sleep(200);
        }
    }
    sp.Open();
}

private void closeCom()
{
    if (sp == null) return;
    if (sp.IsOpen) { sp.Close(); }
}

private string writeCom(string comd)
{
    if (sp == null) return "";
    if (!sp.IsOpen) { sp.Open(); }
    //Method one for hex
    byte[] hexComd = new ASCIIEncoding().GetBytes(comd);
    sp.Write(hexComd, 0, hexComd.Length);

    //Method two for ascii
    //sp.Write(comd);

    //讀取返回數據
    while (sp.BytesToRead == 0)
    {
        Thread.Sleep(1);
    }
    Thread.Sleep(100); //100毫秒內數據接收完畢,可根據實際情況調整
    byte[] recData = new byte[sp.BytesToRead];
    sp.Read(recData, 0, recData.Length);
    var recDataStr = Encoding.ASCII.GetString(recData);
    return recDataStr;
}

三、異步通信與同步通信的特點

1 同步通信

    進行數據傳輸時,發送和接收雙方要保持完全的同步。因此,要求接收和發送設備必須使用同一時鍾。優點是可以實現高速度、大容量的數據傳送;缺點是要求發生時鍾和接收時鍾保持嚴格同步。
2 異步通信

    異步通信是按字符傳輸的。每傳輸一個字符就用起始位來進來收、發雙方的同步。不會因收發雙方的時鍾頻率的小的偏差導致錯誤。
    這種傳輸方式利用每一幀的起、止信號來建立發送與接收之間的同步。特點是:每幀內部各位均采用固定的時間間隔,而幀與幀之間的間隔時隨機的。接收機完全靠每一幀的起始位和停止位來識別字符時正在進行傳輸還是傳輸結束。

    總結:不論是異步通信還是同步通信都需要進行同步,只是異步通信通過傳送字符內的起始位來進行同步,而同步通信采用共用外部時鍾來進行同步。所以,可以說前者是自同步,后者是外同步。

參考文獻

[1] 串口通信異步通信與同步通信的區別
[2] 串口同步和異步理解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM