【发布时间】:2019-11-22 04:23:53
【问题描述】:
我正在编写代码以使用 windows api 通过 C 解析串行数据。我能够读取数据,并且还编写了解析帧的代码。我面临的困难是从传入的串行数据中提取有效帧。
我的解析函数需要一个有效的帧并且没有。该帧中的字节数。
void parse_serial(unsigned char* receivedData, int noOfBytes)
这个帧的结构如下:header(0x10),subsystemID,status,datalength,data,checksum(sum of header until data)。
我想从传入的数据中提取此帧并将其发送到我的解析函数。此外,如果未提取一半帧,则剩余数据应与下一个传入数据一起使用。到目前为止,这是我的代码:
hSerial = CreateFileA(pcCommPort,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
void read_serial()
{
int BUFFERLENGTH =256;
BOOL Read_Status;
unsigned char SerialBuffer[BUFFERLENGTH+1];
DWORD NoBytesRead;
Read_Status = SetCommMask(hSerial, EV_RXCHAR); //Configure Windows to Monitor the serial device for Character Reception
if (Read_Status == FALSE)
printf("Error! in Setting CommMask");
else
printf("Setting CommMask successful");
Read_Status = WaitCommEvent(hComm, &dwEventMask, NULL); //Wait for the character to be received
/*-------------------------- Program will Wait here till a Character is received ------------------------*/
if (Read_Status == FALSE)
{
printf("\n Error! in Setting WaitCommEvent()");
}
else If WaitCommEvent()==True Read the RXed data using ReadFile();
{
printf("\n\n Characters Received \t");
do
{
Read_Status = ReadFile(hComm, &TempChar, sizeof(TempChar), &NoBytesRead, NULL);
if (!ReadFile(hComm, SerialBuffer, BUFFERLENGTH, &NoBytesRead, NULL))
{
printf("wrong character");
}
SerialBuffer[i] = TempChar;
printf("%c", SerialBuffer[i]);
i++;
} while (NoBytesRead > 0);
}
}
【问题讨论】:
-
您实际上并没有告诉我们问题所在。您得到的最接近的是“我面临的困难是在提取有效帧时”。但你永远不会说那个“困难”到底是什么。
-
@kaylum 我不知道如何处理缓冲区的移动。我正在寻找一个流程,在读取串行端口并在 SerialBuffer 中获取数据后如何进行。我应该再制作一个数组来存储它并使用它来附加传入的串行数据吗?
标签: c parsing serial-port serial-communication