win32 api 串口程序
之前也用过vs(visual studio),但是vs比较大,一般也不做专业的软件开发,但可能做一些小程序来辅助我们的工作,还对学习c语言时使用的vc++ 6.0开法环境钟爱有加,完整的包也就几十兆的样子,即使是在win10 64上也是可以照样用的。但vc++的编辑器界面确实比较烂,我一般用开源的notepad++来搭配使用,二vc++只是用来编译!
《王艳平的windows编程》是我最喜欢的windows编程方面的一本书,如果你有c语言基础,并了解一点c++,同时对编程比较感兴趣可以读一读。
实际要开发一个简单的串口程序,实际只需要几十行代码即可,并不需要过多的安装控件啥的:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
unsigned int debug = 0;
//---------------------------
HANDLE hCom2; //串口句柄
DWORD RealBytesNumWritten2=0;
unsigned char OpenComm2(void)
{//打开串口
hCom2=CreateFile("COM3", //串口号
GENERIC_READ|GENERIC_WRITE, //允许读写
NULL, //独占方式
NULL, //安全属性结构
OPEN_EXISTING, //创建标志
NULL, //同步方式
NULL);
if(hCom2==INVALID_HANDLE_VALUE)
{
//printf("打开串口失败!\n");
return 0;
}
//printf("串口打开成功!\n");
return 1;
}
unsigned char ConfigComm2(void)
{//配置串口
SetupComm(hCom2,1024,1024); //设置输入和输出缓冲区的大小
COMMTIMEOUTS CommTimeouts;
// //设定读超时
// CommTimeouts.ReadIntervalTimeout=1000;
// CommTimeouts.ReadTotalTimeoutMultiplier=500;
// CommTimeouts.ReadTotalTimeoutConstant=5000;
//设定读超时
CommTimeouts.ReadIntervalTimeout=10;//读取两个字符之间最大间隔5ms
CommTimeouts.ReadTotalTimeoutMultiplier=1;//
CommTimeouts.ReadTotalTimeoutConstant=10;
//设定写超时
CommTimeouts.WriteTotalTimeoutMultiplier=500;
CommTimeouts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom2,&CommTimeouts);
//配置DCB结构 波特率 校验位 数据位 停止位....
DCB Dcb;
GetCommState(hCom2,&Dcb);
//Dcb.BaudRate=57600;//波特率为9600
Dcb.BaudRate=200000;
Dcb.ByteSize=8;//通信字节数4-8
Dcb.Parity=NOPARITY;//无奇偶校验位
Dcb.StopBits=ONESTOPBIT;//1位停止位
//
Dcb.fRtsControl = RTS_CONTROL_ENABLE ;
SetCommState(hCom2,&Dcb);
//读写之前,使用PurgeComm()函数清空缓存
PurgeComm(hCom2,PURGE_TXCLEAR|PURGE_RXCLEAR);
return 1;
}
//同步读写操作
unsigned char CommRead2(char *AddrStr,DWORD Len,DWORD* pCount)
{//读操作 AddrStr代表保存数据的首地址 pCount 代表实际要读取的字节数指针
::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),10);
if(!ReadFile(hCom2,AddrStr,Len,pCount,NULL))
{
printf("CommRead Error!\n");
return 0;
}
if(*pCount && debug)
printf("BytesNeedToRead:%d\tRealBytesNumReaded:%d\n",Len,*pCount);
::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),0xF);
return 1;
}
unsigned char CommWrite2(char *AddrStr,DWORD Len,DWORD*pCount)
{
COMSTAT CommStat;
DWORD dwErrorFlags;
ClearCommError(hCom2,&dwErrorFlags,&CommStat);
::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),10);
if(!WriteFile(hCom2,AddrStr,Len,pCount,NULL))
{
printf("WriteComm Error! \n");
return 0;
}
if(*pCount && debug)
printf("BytesNeedToWrite:%d\tRealBytesNumWritten:%d\n",Len,*pCount);
::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),0xF);
return 1;
}
unsigned char putbytes2(unsigned char *p ,DWORD L)
{
return CommWrite2((char*)p,L,&RealBytesNumWritten2);
}
unsigned char getbytes2(unsigned char *p ,DWORD L)
{
return CommRead2((char*)p,L,&RealBytesNumWritten2);
}
int main(int argc, char* argv[])
{
//system("mode con cols=80 lines=25");
if( !OpenComm2())
{
printf("打开串口失败!\n");
}
else
{
printf("Comm Open Ok! 200kbps 8,1 rts(actived!)\n");
if( ConfigComm2())
{
printf("ConfigComm Ok!\n");
// BOOL EscapeCommFunction(
// HANDLE hFile, //通信设备的句柄
// DWORD dwFunc //指定执行的功能
// );
//EscapeCommFunction(hCom2,CLRRTS);
EscapeCommFunction(hCom2,SETRTS);//------------
// //char TxData[10]="like";
// //DWORD count=1;
char TxData[64]="like";
char RxData[64]="like";
DWORD count=1;
DWORD count1=1;
//------------------------
//1.set cridet
RxData[0] =0xfe;
RxData[1] =0x87;
RxData[2] =0xfe;
RxData[3] =0x85;
RxData[4] =0xfe;
RxData[5] =0x7f;
RxData[6] =0xff;
printf("1.set cridet\n");
CommWrite2(RxData,7,&count1);
A1:if(CommRead2(RxData,18,&count))
{
if(count) {
for(int i = 0;i<count;i++)
{
unsigned char uc = RxData[i];
printf("%2x ",uc);
}
printf("\n");
}
else
goto A1;
}
//......
}
}
getch();
return 0;
}
还没有评论,来说两句吧...