win32 api 串口程序

灰太狼 2023-01-10 13:25 264阅读 0赞

之前也用过vs(visual studio),但是vs比较大,一般也不做专业的软件开发,但可能做一些小程序来辅助我们的工作,还对学习c语言时使用的vc++ 6.0开法环境钟爱有加,完整的包也就几十兆的样子,即使是在win10 64上也是可以照样用的。但vc++的编辑器界面确实比较烂,我一般用开源的notepad++来搭配使用,二vc++只是用来编译!

《王艳平的windows编程》是我最喜欢的windows编程方面的一本书,如果你有c语言基础,并了解一点c++,同时对编程比较感兴趣可以读一读。

实际要开发一个简单的串口程序,实际只需要几十行代码即可,并不需要过多的安装控件啥的:

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <iostream>
  5. #include <conio.h>
  6. unsigned int debug = 0;
  7. //---------------------------
  8. HANDLE hCom2; //串口句柄
  9. DWORD RealBytesNumWritten2=0;
  10. unsigned char OpenComm2(void)
  11. {//打开串口
  12. hCom2=CreateFile("COM3", //串口号
  13. GENERIC_READ|GENERIC_WRITE, //允许读写
  14. NULL, //独占方式
  15. NULL, //安全属性结构
  16. OPEN_EXISTING, //创建标志
  17. NULL, //同步方式
  18. NULL);
  19. if(hCom2==INVALID_HANDLE_VALUE)
  20. {
  21. //printf("打开串口失败!\n");
  22. return 0;
  23. }
  24. //printf("串口打开成功!\n");
  25. return 1;
  26. }
  27. unsigned char ConfigComm2(void)
  28. {//配置串口
  29. SetupComm(hCom2,1024,1024); //设置输入和输出缓冲区的大小
  30. COMMTIMEOUTS CommTimeouts;
  31. // //设定读超时
  32. // CommTimeouts.ReadIntervalTimeout=1000;
  33. // CommTimeouts.ReadTotalTimeoutMultiplier=500;
  34. // CommTimeouts.ReadTotalTimeoutConstant=5000;
  35. //设定读超时
  36. CommTimeouts.ReadIntervalTimeout=10;//读取两个字符之间最大间隔5ms
  37. CommTimeouts.ReadTotalTimeoutMultiplier=1;//
  38. CommTimeouts.ReadTotalTimeoutConstant=10;
  39. //设定写超时
  40. CommTimeouts.WriteTotalTimeoutMultiplier=500;
  41. CommTimeouts.WriteTotalTimeoutConstant=2000;
  42. SetCommTimeouts(hCom2,&CommTimeouts);
  43. //配置DCB结构 波特率 校验位 数据位 停止位....
  44. DCB Dcb;
  45. GetCommState(hCom2,&Dcb);
  46. //Dcb.BaudRate=57600;//波特率为9600
  47. Dcb.BaudRate=200000;
  48. Dcb.ByteSize=8;//通信字节数4-8
  49. Dcb.Parity=NOPARITY;//无奇偶校验位
  50. Dcb.StopBits=ONESTOPBIT;//1位停止位
  51. //
  52. Dcb.fRtsControl = RTS_CONTROL_ENABLE ;
  53. SetCommState(hCom2,&Dcb);
  54. //读写之前,使用PurgeComm()函数清空缓存
  55. PurgeComm(hCom2,PURGE_TXCLEAR|PURGE_RXCLEAR);
  56. return 1;
  57. }
  58. //同步读写操作
  59. unsigned char CommRead2(char *AddrStr,DWORD Len,DWORD* pCount)
  60. {//读操作 AddrStr代表保存数据的首地址 pCount 代表实际要读取的字节数指针
  61. ::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),10);
  62. if(!ReadFile(hCom2,AddrStr,Len,pCount,NULL))
  63. {
  64. printf("CommRead Error!\n");
  65. return 0;
  66. }
  67. if(*pCount && debug)
  68. printf("BytesNeedToRead:%d\tRealBytesNumReaded:%d\n",Len,*pCount);
  69. ::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),0xF);
  70. return 1;
  71. }
  72. unsigned char CommWrite2(char *AddrStr,DWORD Len,DWORD*pCount)
  73. {
  74. COMSTAT CommStat;
  75. DWORD dwErrorFlags;
  76. ClearCommError(hCom2,&dwErrorFlags,&CommStat);
  77. ::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),10);
  78. if(!WriteFile(hCom2,AddrStr,Len,pCount,NULL))
  79. {
  80. printf("WriteComm Error! \n");
  81. return 0;
  82. }
  83. if(*pCount && debug)
  84. printf("BytesNeedToWrite:%d\tRealBytesNumWritten:%d\n",Len,*pCount);
  85. ::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE),0xF);
  86. return 1;
  87. }
  88. unsigned char putbytes2(unsigned char *p ,DWORD L)
  89. {
  90. return CommWrite2((char*)p,L,&RealBytesNumWritten2);
  91. }
  92. unsigned char getbytes2(unsigned char *p ,DWORD L)
  93. {
  94. return CommRead2((char*)p,L,&RealBytesNumWritten2);
  95. }
  96. int main(int argc, char* argv[])
  97. {
  98. //system("mode con cols=80 lines=25");
  99. if( !OpenComm2())
  100. {
  101. printf("打开串口失败!\n");
  102. }
  103. else
  104. {
  105. printf("Comm Open Ok! 200kbps 8,1 rts(actived!)\n");
  106. if( ConfigComm2())
  107. {
  108. printf("ConfigComm Ok!\n");
  109. // BOOL EscapeCommFunction(
  110. // HANDLE hFile, //通信设备的句柄
  111. // DWORD dwFunc //指定执行的功能
  112. // );
  113. //EscapeCommFunction(hCom2,CLRRTS);
  114. EscapeCommFunction(hCom2,SETRTS);//------------
  115. // //char TxData[10]="like";
  116. // //DWORD count=1;
  117. char TxData[64]="like";
  118. char RxData[64]="like";
  119. DWORD count=1;
  120. DWORD count1=1;
  121. //------------------------
  122. //1.set cridet
  123. RxData[0] =0xfe;
  124. RxData[1] =0x87;
  125. RxData[2] =0xfe;
  126. RxData[3] =0x85;
  127. RxData[4] =0xfe;
  128. RxData[5] =0x7f;
  129. RxData[6] =0xff;
  130. printf("1.set cridet\n");
  131. CommWrite2(RxData,7,&count1);
  132. A1:if(CommRead2(RxData,18,&count))
  133. {
  134. if(count) {
  135. for(int i = 0;i<count;i++)
  136. {
  137. unsigned char uc = RxData[i];
  138. printf("%2x ",uc);
  139. }
  140. printf("\n");
  141. }
  142. else
  143. goto A1;
  144. }
  145. //......
  146. }
  147. }
  148. getch();
  149. return 0;
  150. }

发表评论

表情:
评论列表 (有 0 条评论,264人围观)

还没有评论,来说两句吧...

相关阅读

    相关 win32 api 串口程序

      之前也用过vs(visual studio),但是vs比较大,一般也不做专业的软件开发,但可能做一些小程序来辅助我们的工作,还对学习c语言时使用的vc++ 6.0开法环境钟

    相关 WIN32串口编程

    [WIN32串口编程][WIN32]        -----已用   在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便

    相关 Win32 API 串口编程

    目录 一串口通信基础       1.1串口通信原理与特点      1.2串口通信的传输方式      1.3串口通信的同步技术      1.4串行接口标准