windows下串口初步编程(多线程+windows串口)

来源:互联网 发布:带mp3 解码 单片机 编辑:程序博客网 时间:2024/06/16 07:55

环境

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 <windows.h>#include <stdio.h>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;}

[20170713]

原创粉丝点击