问题背景:
最近在做一个关于RFID射频识别的小设计,买了一个开发套件是R200超高频开发板,直接将数据传给PC没有通过单片机。
串口通信协议是ISO 18000-6c。我本人没有太多的基础,学过一些c和c++,想用c写一个简单的模块儿可以和该开发板通信,但我不太清楚是要怎么做,我查了查资料,网上大部分说是用win32的API和它进行串口通信,通过ReadFile和WriteFile进行数据的读取和写入,然后我去尝试了一下,我写入的直接是串口通信协议指令,但是ReadFile却什么数据都读不到,我不太理解是怎么回事,希望能有大家帮我指点一下是我的过程错了,还是我传的数据错了,还是我整个思路都错了?
代码如下:
#include<windows.h>
#include<stdio.h>
#include<winbase.h>
int Init(HANDLE hcom) //对串口进行初始化的函数
{
DCB dcb;//DCB是一个结构体类型
if (GetCommState(hcom, &dcb) == 0)
{
printf("获取串口状态失败!");
return 0;
}
printf("获取串口状态成功\n");
printf("串口的波特率是:%u\n", dcb.BaudRate);
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
printf("改变后的串口的波特率是:%u\n", dcb.BaudRate);
if (SetCommState(hcom, &dcb) == 1)
{
printf("改变串口状态成功!\n");
}
else
{
printf("改变串口状态失败!\n");
return 0;
}
PurgeComm(hcom, PURGE_TXCLEAR | PURGE_RXCLEAR);
return 1;
}
int main()
{
HANDLE hcom;
unsigned char buf[10] = { 0xBB,0x00,0x27,0x00,0x03,0x22,0x00,0xFF,0x4A,0x7E};//写入缓冲区
unsigned char buf1[1024] = { 0 };//读取缓冲区
DWORD num = 0;
DWORD num1 = 0;
OVERLAPPED overlap;
OVERLAPPED overlap1;
bool rc, rc1;
hcom = CreateFile("COM6", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (hcom == INVALID_HANDLE_VALUE)//invalid 无效的,指无效的句柄值
{
printf("error!\n");
return -1;
}
else
printf("success!\n");
if (Init(hcom) == 1) //对串口进行初始化
printf("初始化成功!\n");
memset(&overlap, 0, sizeof(overlap)); //初始化结构体overlap
overlap.Offset = 0;
rc = WriteFile(hcom, buf, sizeof(buf), &num, &overlap);
if (rc)
{
printf("书写成功!\n");
}
else
{
if (GetLastError() == ERROR_IO_PENDING)
{
printf("还在书写中,waiting...\n");
WaitForSingleObject(hcom, INFINITE);
rc = GetOverlappedResult(hcom, &overlap, &num, FALSE);
printf("书写成功!\n\n");
}
else
{
printf("写入失败!\n");
return -1;
}
}
Sleep(1000);
memset(&overlap1, 0, sizeof(overlap1));
memset(&buf1, 0, sizeof(buf1));
overlap1.Offset = 0;
rc1 = ReadFile(hcom, buf1, 24, &num1, &overlap1); //遇到了个问题,缓冲区是什么? LPOVERLAPPED的参数是什么我也不理解
if (rc1)
{
}
else
{
if (GetLastError() == ERROR_IO_PENDING) //意味着当线程还在进行中
{
printf("数据读取中,waiting....\n");
WaitForSingleObject(hcom, 5000);//等待文件读完
rc1 = GetOverlappedResult(hcom, &overlap1, &num1, FALSE);//函数返回指定文件(名称为管道或通信设备)上的重叠操作的结果。
if (num1!= 0)
printf("读取成功!\n");
else
printf("读取失败555\n");
}
else
{
printf("读取线程失败!\n");
return -1;
}
}
printf("读取出来的数据长度是:%d\n", num1);
printf("读取出来的数据是:%x\n", buf1[0]);
if (CloseHandle(hcom) == 0)
printf("关闭串口失败\n");
else
printf("关闭串口成功\n");
return 0;
}
运行结果:
谢谢各位!