RS232串口数据解析

RS232
波特率:4800
数据位:8
检验方式:无
停止位: 1
接收到的ASCII为:IJJz,请问怎么解析,有偿

将这个字符转换为ascii就是具体的数据了!

如果是使用c++的话,方法如下:
 
读取COM1端口上的数据并将其解析为ASCII字符串:


#include <iostream>
#include <string>
#include <Windows.h>

int main()
{
    HANDLE hSerial;
    DCB dcbSerialParams = { 0 };
    COMMTIMEOUTS timeouts = { 0 };
    DWORD dwBytesRead = 0;
    char szBuff[1024];
    std::string strData;

    hSerial = CreateFile(L"COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hSerial == INVALID_HANDLE_VALUE)
    {
        std::cout << "Failed to open COM1 port." << std::endl;
        return 1;
    }

    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams))
    {
        std::cout << "Failed to get COM1 port state." << std::endl;
        CloseHandle(hSerial);
        return 1;
    }

    dcbSerialParams.BaudRate = CBR_4800;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;

    if (!SetCommState(hSerial, &dcbSerialParams))
    {
        std::cout << "Failed to set COM1 port state." << std::endl;
        CloseHandle(hSerial);
        return 1;
    }

    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;

    if (!SetCommTimeouts(hSerial, &timeouts))
    {
        std::cout << "Failed to set COM1 port timeouts." << std::endl;
        CloseHandle(hSerial);
        return 1;
    }

    while (true)
    {
        if (ReadFile(hSerial, szBuff, sizeof(szBuff), &dwBytesRead, NULL))
        {
            if (dwBytesRead > 0)
            {
                strData.append(szBuff, dwBytesRead);
                std::cout << "Received data: " << strData << std::endl;
            }
        }
    }

    CloseHandle(hSerial);
    return 0;
}

在收到数据后,将其解析为ASCII字符串:
 


std::string strData = "IJJz";
std::string strAscii;
for (int i = 0; i < strData.length(); i += 2)
{
    std::string strByte = strData.substr(i, 2);
    char chByte = (char)std::stoi(strByte, nullptr, 16);
    strAscii += chByte;
}
std::cout << "ASCII string: " << strAscii << std::endl;

这段代码将收到的数据每两个字符一组,转换为一个字节,并将字节转换为ASCII字符。

C#更简单了,创建framework项目,拖个串口控件进去,设置下参数,双击DataReceived事件,代码

        private void 串口_DataReceived(object sender, SerialDataReceivedEventArgs e) {
            SerialPort sp = sender as SerialPort;
            int len = sp.BytesToRead;
            byte[] buffer = new byte[len];
            sp.Read(buffer, 0, len);
            string str = Encoding.ASCII.GetString(buffer);//这里就获取到串口的数据了
        }