win10操作系统
编程环境:Eclipse、Cygwin GCC编译器
串口环境:串口调试助手v2.1、 虚拟串口助手(Virtual Serial Port Driver 7.2)
1. 在Eclipse环境下新建一个C++工程,并指定使用Cygwin GCC编译器
2. 新建cpp文件,输入代码
3. 打开虚拟串口助手和串口调试助手,建立串口调试的环境
4. 编译和运行
1. 串口作为一种接口,标准C中均使用fopen函数打开,但是该函数在windows系统下无法操作串口;
2. windows封装了接口操作,使用createfile函数操作;
3. 使用createthread创建两个线程,分别执行串口的读和写操作。
#include
#include
HANDLE hCom;//句柄,用于初始化串口
DWORD WINAPI ThreadWrite(LPVOID lpParameter)//进程1
{
char outputData[100]={0x00};//输出数据缓存
if( hCom==INVALID_HANDLE_VALUE )
{
puts("打开串口失败");
return 0;
}
DWORD strLength = 0;
while(1)
{
for(int i=0;i<100;i++)
{
outputData[i]=0;
}
fgets(outputData,100,stdin); // 从控制台输入字符串
strLength = strlen(outputData);
printf("string length is %d\n",strLength); // 打印字符串长度
WriteFile( hCom,outputData,strLength,&strLength,NULL); // 串口发送字符串
fflush(stdout);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区
Sleep(100);
}
return 0;
}
DWORD WINAPI ThreadRead(LPVOID lpParameter)
{
if( hCom==INVALID_HANDLE_VALUE ) //INVALID_HANDLE_VALUE表示出错,会设置GetLastError
{
puts("打开串口失败");
return 0;
}
char getputData[100]={0x00};//输入数据缓存
// 利用错误信息来获取进入串口缓冲区数据的字节数
DWORD dwErrors; // 错误信息
COMSTAT Rcs; // COMSTAT结构通信设备的当前信息
int Len=0;
DWORD length = 100; //用来接收读取的字节数
while(1)
{
for(int i=0;i<100;i++)
{
getputData[i]=0;
}
ClearCommError(hCom,
&dwErrors,
&Rcs); // 获取读缓冲区数据长度
Len = Rcs.cbInQue;
ReadFile(hCom,getputData,Len,&length,NULL); //获取字符串
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区
if(Len>0)
{
printf("%s\n",getputData);
fflush(stdout);
}
Sleep(100);
}
return 0;
}
int main()
{
// 初始化串口
hCom = CreateFile(TEXT("COM2"), GENERIC_READ | GENERIC_WRITE , 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// 获取和设置串口参数
DCB myDCB;
GetCommState(hCom, &myDCB); // 获取串口参数
printf("baud rate is %d",(int)myDCB.BaudRate);
fflush(stdout);
myDCB.BaudRate = 9600; // 波特率
myDCB.Parity = NOPARITY; // 校验位
myDCB.ByteSize = 8; // 数据位
myDCB.StopBits = ONESTOPBIT; // 停止位
SetCommState(hCom, &myDCB); // 设置串口参数
// 线程创建
HANDLE HRead,HWrite;
HWrite = CreateThread(NULL,0,ThreadWrite,NULL,0,NULL);
HRead = CreateThread(NULL,0,ThreadRead,NULL,0,NULL);
while(1){;}
CloseHandle(HRead);
CloseHandle(HWrite);
return 0;
}