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);//这里就获取到串口的数据了
}