分类: WINDOWS
2013-02-05 15:38:55
代码:
#include#include #include // 声明快照函数的头文件 HANDLE hCom; void CALLBACK TimeProc( HWND hwnd, UINT message, UINT idTimer, DWORD dwTime); int main(int argc, char* argv[]) { LPCTSTR lpComx; int i; printf("开始通讯\n"); printf("输入串口名:(1-9)\n"); scanf("%d",&i); switch(i) { case 1: lpComx="COM1"; break; case 2: lpComx="COM2"; break; case 3: lpComx="COM3"; break; case 4: lpComx="COM4"; break; case 5: lpComx="COM5"; break; case 6: lpComx="COM6"; break; case 7: lpComx="COM7"; break; case 8: lpComx="COM8"; break; case 9: lpComx="COM9"; break; default: printf("串口号错误\n"); return 0; break; } hCom=CreateFile(lpComx, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,//同步方式 NULL); if(hCom==(HANDLE)-1) { printf("打开\"%s\"失败!",lpComx); return 0; } printf("打开\"%s\"成功\n",lpComx); /* 配置串口 */ SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024 COMMTIMEOUTS TimeOuts; //设定读超时 TimeOuts.ReadIntervalTimeout = 1000; TimeOuts.ReadTotalTimeoutMultiplier = 0; TimeOuts.ReadTotalTimeoutConstant = 0; //设定写超时 TimeOuts.WriteTotalTimeoutMultiplier = 500; TimeOuts.WriteTotalTimeoutConstant = 2000; SetCommTimeouts(hCom, &TimeOuts); //设置超时 DCB dcb; GetCommState(hCom, &dcb); dcb.BaudRate = 1200; //波特率为9600 dcb.ByteSize = 8; //每个字节有8位 dcb.Parity = NOPARITY; //无奇偶校验位 dcb.StopBits = ONESTOPBIT; //一个停止位 SetCommState(hCom, &dcb); //在读写串口之前,还要用PurgeComm()函数清空缓冲区 PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); SetTimer(NULL,1,1000,TimeProc); MSG msg; while(GetMessage(&msg,NULL,0,0)) { if(msg.message==WM_TIMER) { DispatchMessage(&msg); } } return 0; } //定时器触发调用函数 void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime) { PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); unsigned char uartOutBuffer[11]={0xe5,0x02,0x03,0xff,0x04,0x05, 0x06,0x07,0x08,0x09,0x0a}; DWORD dwBytesWrite=11; COMSTAT ComStat; DWORD dwErrorFlags; BOOL bWriteStat; ClearCommError(hCom,&dwErrorFlags,&ComStat); bWriteStat = WriteFile(hCom, uartOutBuffer, dwBytesWrite, &dwBytesWrite, NULL); if(!bWriteStat) { printf("写串口失败!\n"); } else { printf("写串口成功!\n"); } PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); unsigned char uartInBuffer[8]; DWORD wCount;//读取的字节数 BOOL bReadStat; bReadStat = ReadFile(hCom,uartInBuffer,8,&wCount,NULL); if(!bReadStat) { printf("读串口失败!\n"); } else { printf("串口接收:0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", uartInBuffer[0],uartInBuffer[1],uartInBuffer[2],uartInBuffer[3], uartInBuffer[4],uartInBuffer[5],uartInBuffer[6],uartInBuffer[7]); } }
参考:http://www.cnblogs.com/xi52qian/archive/2011/08/30/2159675.html
http://www.programfan.com/blog/article.asp?id=29793
这个程序已经与显示板调通
PS:看到句柄神马的真有点云里雾里,还是先用控制台玩玩等春节后显示板程序都完善了。届时搞个完善的上位机程序模拟主控板。