搜索
bottom↓
回复: 9

求如何用C WIN32 API 写一个串口通信

[复制链接]

出0入0汤圆

发表于 2015-8-7 23:32:20 | 显示全部楼层 |阅读模式
求如何用C WIN32 API 写一个串口通信,
不好意思了,只会C语言 ,想在windos 控制台下实现个 串口通信,来协助调试单片机,有写过的 帮忙指导下

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-8-8 02:38:01 | 显示全部楼层
可以,百度一下 win32 串口就有了。不过写起来长的,不如看看用C#什么的带的库写,分分钟的事情。

出0入0汤圆

发表于 2015-8-8 09:50:00 | 显示全部楼层
坛子里有个labview大神,这玩意更简单。不用代码。掌握规律后,分分钟的事。

出0入0汤圆

 楼主| 发表于 2015-8-8 15:02:14 | 显示全部楼层
dou_yuyu 发表于 2015-8-8 02:38
可以,百度一下 win32 串口就有了。不过写起来长的,不如看看用C#什么的带的库写,分分钟的事情。 ...

就是为了好测试 ,都是C语言两个平台好移植啊

出0入0汤圆

发表于 2015-8-8 15:23:41 来自手机 | 显示全部楼层
pcommlite库

出0入0汤圆

发表于 2015-8-8 17:25:52 | 显示全部楼层
yxylxj 发表于 2015-8-8 15:02
就是为了好测试 ,都是C语言两个平台好移植啊

你既然决定用win32 的api 来搞pc串口,最优选择就是vc++了,兼容纯c的。但是问题是,这样搞不省力的。其实还是建议用控件或者类库就可以了。

出0入0汤圆

 楼主| 发表于 2015-10-25 10:49:19 | 显示全部楼层
本帖最后由 yxylxj 于 2015-10-25 10:50 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <windows.h>
  5. #include <winbase.h>
  6. #include <winerror.h>
  7. #include <conio.h>



  8. #define RX_SIZE        1024*8
  9. #define true        1                //数据缓冲区大小
  10. #define false 0
  11. #define bool char





  12. DCB    dcb;
  13. COMMTIMEOUTS ct;
  14. HANDLE hCommDevice;
  15. bool   m_portopen,OpenCloseFlag;
  16. OVERLAPPED m_ovread,m_ovwrite,m_ovwait;


  17. int ProcessErrorMessage(char* ErrorText)
  18. {

  19.     char szBuf[128];
  20.     LPVOID lpMsgBuf;
  21.     DWORD dw = GetLastError();
  22.     FormatMessage(
  23.     FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  24.     NULL,
  25.     dw,
  26.     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  27.     (LPTSTR) &lpMsgBuf,
  28.     0,
  29.     NULL );
  30.     sprintf(szBuf,"%s 出错信息 (出错码=%ld): %s",ErrorText, dw,(char *) lpMsgBuf);
  31.     LocalFree(lpMsgBuf);
  32.     //输出提示。
  33.     printf(szBuf);
  34.     return 0;
  35. }


  36. void CCommPort(void)
  37. {
  38.   hCommDevice = NULL;
  39.   m_portopen = false;
  40.   memset(&m_ovread,0,sizeof(OVERLAPPED));
  41.   memset(&m_ovwrite,0,sizeof(OVERLAPPED));
  42.   memset(&m_ovwait,0,sizeof(OVERLAPPED));
  43.   m_ovwait.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  44.   m_ovwrite.hEvent= CreateEvent(NULL,TRUE,FALSE,NULL);
  45.   m_ovread.hEvent= CreateEvent(NULL,TRUE,FALSE,NULL);
  46. }
  47. //---------------------------------------------------------------------------
  48. void CCommPort2(void)
  49. {
  50.    if (hCommDevice)
  51.    CloseHandle(hCommDevice);
  52.    CloseHandle(m_ovwait.hEvent);
  53.    CloseHandle(m_ovwrite.hEvent);
  54.    CloseHandle(m_ovread.hEvent);
  55. }
  56. //---------------------------------------------------------------------------
  57. bool InitPort(LPCSTR comm)
  58. {
  59.     if (m_portopen)
  60.        return m_portopen;
  61.     bool result = false;
  62.     hCommDevice = CreateFile(comm,
  63.         GENERIC_WRITE|GENERIC_READ,
  64.         0,    /* comm devices must be opened w/exclusive-access */
  65.         NULL, /* no security attrs */
  66.         OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */
  67.         FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, /* not overlapped I/O */
  68.         NULL  /* hTemplate must be NULL for comm devices */
  69.         );    /* handle error */
  70.     if(hCommDevice == INVALID_HANDLE_VALUE)
  71.       {
  72.          ProcessErrorMessage("INVALID_HANDLE_VALUE\r\n");
  73.          printf(" open failed\r\n");
  74.          result = false;
  75.       }
  76.       else
  77.       {
  78.           printf(" open success\r\n");
  79.           OpenCloseFlag = 1;
  80.          //Get the config of the modem connection
  81.          GetCommState(hCommDevice, &dcb);
  82.          //Set to 8 bits, no parity, 1 stopbit
  83.          dcb.BaudRate = 115200;
  84.          dcb.ByteSize = 8;
  85.          dcb.Parity   = 0;//EVENPARITYNOPARITY;
  86.          dcb.StopBits = ONESTOPBIT;
  87.          dcb.fDtrControl = DTR_CONTROL_ENABLE;//DTR_CONTROL_DISABLE;//1;
  88.          dcb.fRtsControl = RTS_CONTROL_ENABLE;//RTS_CONTROL_DISABLE;//1;
  89.          dcb.fBinary = 1;
  90.          dcb.fParity = FALSE;
  91.          dcb.fOutxCtsFlow = FALSE;
  92.          //Actually set the config
  93.          SetCommState(hCommDevice, &dcb);

  94.          if (!SetupComm(hCommDevice, 256, 256))
  95.          {
  96.              CloseHandle(hCommDevice);
  97.              result = false;
  98.          }
  99.          else
  100.          {
  101.          //Get timeout information for the communications channel
  102.            GetCommTimeouts(hCommDevice, &ct);
  103.            ct.ReadIntervalTimeout=100;
  104.            ct.ReadTotalTimeoutMultiplier=0;
  105.            ct.ReadTotalTimeoutConstant=100;
  106.            ct.WriteTotalTimeoutMultiplier=50;
  107.            ct.WriteTotalTimeoutConstant=100;
  108.            SetCommTimeouts(hCommDevice, &ct);
  109.            COMSTAT com;
  110.            DWORD Errors;
  111.            ClearCommError(hCommDevice,&Errors,&com);
  112.            if (com.cbInQue>0)
  113.                PurgeComm(hCommDevice,PURGE_RXCLEAR|PURGE_TXCLEAR);
  114.            SetCommMask(hCommDevice,EV_RXCHAR);
  115.            result = true;
  116.            m_portopen = true;
  117.          }
  118.       }
  119.       return result;
  120. }

  121. //---------------------------------------------------------------------------
  122. bool WritePort(PCVOID lpszSendBuffer,DWORD dwLength)
  123. {
  124.    BOOL        fWriteStat = 0;
  125.    DWORD       dwBytesWritten = 0;
  126.    DWORD       dwErrorFlags  = 0;
  127.    DWORD       dwBytesSent=0;
  128.    COMSTAT     ComStat;
  129. //   HANDLE  m_hWriteEvent;
  130. //   ResetEvent(m_hWriteEvent);

  131.    ClearCommError( hCommDevice, &dwErrorFlags, &ComStat ) ;
  132.    PurgeComm(hCommDevice,PURGE_RXCLEAR|PURGE_TXCLEAR);
  133.    m_ovwrite.Offset=0;
  134.    fWriteStat = WriteFile(hCommDevice, lpszSendBuffer,dwLength,&dwBytesWritten, &m_ovwrite) ;
  135.    if (!fWriteStat)
  136.       {
  137.          if(GetLastError() == ERROR_IO_PENDING)
  138.          {
  139.             if (!GetOverlappedResult(hCommDevice,&m_ovwrite, &dwBytesWritten, true))
  140.             {
  141.                ClearCommError( hCommDevice, &dwErrorFlags, &ComStat ) ;
  142.                  return FALSE;
  143.             }
  144.             dwBytesSent += dwBytesWritten;
  145.             if( dwBytesSent != dwLength)
  146.               return FALSE;
  147.             else
  148.               return TRUE;
  149.          }//Io pending Error
  150.          else
  151.          {
  152.             ClearCommError( hCommDevice, &dwErrorFlags, &ComStat ) ;
  153.             PurgeComm(hCommDevice,PURGE_RXCLEAR|PURGE_TXCLEAR);
  154.             return  FALSE;
  155.          }
  156.       }
  157.       return TRUE  ;
  158. }


  159. char Rxbuff[RX_SIZE];



  160. DWORD WINAPI  Thread_Tx(LPVOID nParam)
  161. {
  162.    unsigned char buff[1024];//= "hello world\r\n";
  163.    char input[2],tmp;
  164.    int i=0;
  165.     printf("%s","/***********************************************\r\n");
  166.     printf("%s","Please press '1' to Test CMD 0x01----Set Fed Prama\r\n");

  167.    while(hCommDevice != INVALID_HANDLE_VALUE)
  168.    {
  169.      memset(buff,0x00,sizeof(buff));
  170.      memset(buff,0x00,sizeof(input));
  171.      i = 0;

  172.       printf("\r\n ");
  173.       while(1){
  174.           scanf("%c",&tmp);
  175.           if(tmp!='\n'&&tmp!=' '){
  176.              input[i]=tmp;
  177.              if(i<1) i++;
  178.           }
  179.           else
  180.           break;
  181.       }
  182.      switch(input[0])
  183.      {
  184.          case '1':
  185.             buff[0]=0x01;
  186.             buff[1]=0x02;
  187.             buff[2]=0x03;
  188.             buff[3]=0x04;

  189.             buff[4]=0X05;
  190.             buff[5]=0X06;
  191.             buff[6]=0X07;
  192.             buff[7]=0X08;
  193.             buff[8]=0X09;
  194.             buff[9]=0X0a;
  195.             buff[10]=0X0b;
  196.             buff[11]=0X0c;
  197.             buff[12]=0X0d;
  198.             buff[13]=0X0e;

  199.             WritePort(buff,14);
  200.             break;
  201.             default : printf("0x0c cmd :Error cmd \r\n ");break;

  202.      }
  203.             printf("%02X cmd :\r\n ",buff[2]);
  204.             for(i=0;i<buff[3]+4;i++)
  205.             printf("0x%02X ",buff[i]);
  206.             printf("\r\n ");


  207.             Sleep(100);
  208.    }
  209.    return 0;
  210. }


  211. void Deal_buff(unsigned char *buff,DWORD cnt)
  212. {
  213.     unsigned char *p =buff;
  214.     while(cnt)
  215.     {
  216.         cnt--;
  217.         printf("0x%02X",*p++);//        printf("%c",*p);
  218.         printf(" ");
  219.     }
  220.         printf("\r\n");
  221. }

  222. DWORD WINAPI  Thread_Rx(LPVOID nParam)
  223. {
  224.     BOOL bRead =TRUE;
  225.     BOOL bResult =TRUE;
  226.     DWORD dwError =0;
  227.     DWORD BytesRead ;
  228.     COMSTAT ComStat ;
  229.     unsigned char Rxbuff[RX_SIZE];

  230.     for(;;)
  231.     {

  232.         ClearCommError( hCommDevice, &dwError, &ComStat);
  233.         if(ComStat.cbInQue==0){
  234.             continue;
  235.         }

  236.         if (bRead){
  237.             bResult = ReadFile(hCommDevice, // Handle to COMM port
  238.             &Rxbuff,// RX Buffer Pointer
  239.             RX_SIZE,//RX_SIZE// Read one byte
  240.             &BytesRead,//
  241.             &m_ovread);


  242. //            printf("0x%02X",Rxbuff[0]);
  243. //            printf(" ");

  244.             if(!bResult){//读不成功
  245.                 switch (dwError = GetLastError())
  246.                 {
  247.                     case ERROR_IO_PENDING:
  248.                         bRead = FALSE;
  249.                         break;
  250.                     default: break;
  251.                 }

  252.                 } if(bResult){//读成功
  253.                 bRead = TRUE;
  254.             }



  255.         }if (!bRead) {
  256.             bRead = TRUE;
  257.             bResult = GetOverlappedResult(hCommDevice,   // Handle to COMM port
  258.             &m_ovread,       // Overlapped structure
  259.             &BytesRead,     // Stores number of bytes read
  260.             TRUE);           // Wait flag

  261.             if(BytesRead)//bResult
  262.             {
  263.                 printf("Recived  = %ld Bytes   ",BytesRead);
  264.                 Deal_buff(Rxbuff,BytesRead);
  265.                 memset(Rxbuff,0x00,sizeof(Rxbuff));

  266.             }
  267.         }
  268.    }


  269. }

  270. int main ()
  271. {
  272.    InitPort("com5");
  273.    CreateThread(NULL ,0,Thread_Tx,0,0,NULL);
  274.    CreateThread(NULL ,0,Thread_Rx,0,0,NULL);//Thread_Rx
  275.    while(1);
  276.    return 0;
  277. }
复制代码

出0入0汤圆

发表于 2015-10-25 11:37:03 来自手机 | 显示全部楼层
win32写的程序性能非常好,而且都非常短小,就是界面比较古老

出0入17汤圆

发表于 2015-10-25 18:43:58 来自手机 | 显示全部楼层
myxiaonia 发表于 2015-10-25 11:37
win32写的程序性能非常好,而且都非常短小,就是界面比较古老

win32写核心代码,封装成dll,MFC,C#,VB写界面,妥妥的

出0入0汤圆

 楼主| 发表于 2015-10-25 20:40:41 | 显示全部楼层
myxiaonia 发表于 2015-10-25 11:37
win32写的程序性能非常好,而且都非常短小,就是界面比较古老

有空帮忙看下 ,上面的有没有问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 09:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表