3321|3

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教一下WinCE串口通讯的问题,大侠们一看估计就知道原因,但困扰我了 [复制链接]

闲话少说,贴出代码来:



  1. //串口打开函数
  2. BOOL OpenPort(HWND hWnd)
  3. {
  4.         DWORD dwError;

  5.         //打开串口
  6.         hSerPort=CreateFile(TEXT("COM1:"),
  7.                                                 GENERIC_READ | GENERIC_WRITE,
  8.                                                 0,
  9.                                                 NULL,
  10.                                                 OPEN_EXISTING,
  11.                                                 0,
  12.                                                 NULL);

  13.         if(hSerPort == INVALID_HANDLE_VALUE)
  14.         {
  15.                 dwError = GetLastError();
  16.                 MessageBox(hWnd, _T("Open Port (COM1:) Error!"), _T("ERROR"), 0);
  17.                 return FALSE;
  18.         }
  19.        
  20.         //设置串口输入输出缓冲区大小
  21.         //SetupComm(hSerPort, _InQue, _OutQue);

  22.         //设置串口事件掩码
  23.         //SetCommMask(hSerPort, 0);

  24.         //设置串口属性
  25.         if(ConfigComm())
  26.         {
  27.                 fContinue = TRUE;
  28.                 return TRUE;
  29.         }
  30.         else
  31.         {
  32.                 MessageBox(hWnd, TEXT("Config COM1: error!"), TEXT("ERROR"), 0);
  33.                 CloseHandle(hSerPort);
  34.                 return FALSE;
  35.         }
  36. }

  37. //串口设置函数
  38. BOOL ConfigComm()
  39. {
  40.         DCB dcb;
  41.         COMMTIMEOUTS tmOuts;

  42.         //获取串口原始属性
  43.         GetCommState(hSerPort, &dcb);

  44.         dcb.BaudRate = 19200;                // 设置波特率
  45.         dcb.ByteSize = 8;                        // 数据位,范围:4-8
  46.         dcb.Parity   = NOPARITY;        // 校验模式:无校验
  47.         dcb.StopBits = ONESTOPBIT;        // 停止位: 1位
  48.         dcb.fParity  = FALSE;                // 不支持奇偶校验
  49.         //dcb.fBinary  = TRUE;                // 设置二进制模式,此处必须设置TRUE
  50.         dcb.fNull    = FALSE;                // Disable null stripping

  51.         /*以下这些设置了之后有用么???
  52.         dcb.fOutxCtsFlow  = FALSE;        // No CTS output flow control
  53.         dcb.fOutxDsrFlow  = FALSE;        // No DSR output flow control
  54.         dcb.fDtrControl   = DTR_CONTROL_DISABLE;        //启用流量控制

  55.         // DTR flow control type
  56.         dcb.fDsrSensitivity   = FALSE;        // DSR sensitivity
  57.         dcb.fTXContinueOnXoff = TRUE;        // XOFF continues Tx
  58.         dcb.fOutX             = FALSE;        // No XON/XOFF out flow control
  59.         dcb.fInX              = FALSE;        // No XON/XOFF in flow control
  60.         dcb.fErrorChar        = FALSE;        // Disable error replacement

  61.         dcb.fRtsControl       = RTS_CONTROL_ENABLE;        // RTS flow control
  62.         dcb.fAbortOnError     = FALSE;        // 当串口发生错误,并不终止串口读写
  63.         */

  64.         if(!SetCommState(hSerPort, &dcb))
  65.         {
  66.                 return FALSE;
  67.         }

  68.         //设置串口超时时间,[color=#FF0000]这样设置有问题吗?超时的设置是不是跟波特率有关才行?[/color]
  69.         GetCommTimeouts(hSerPort, &tmOuts);
  70.         tmOuts.ReadIntervalTimeout = 0;
  71.         tmOuts.ReadTotalTimeoutConstant = 0;
  72.         tmOuts.ReadTotalTimeoutMultiplier = 0;
  73.         tmOuts.WriteTotalTimeoutConstant = 0;
  74.         tmOuts.WriteTotalTimeoutMultiplier = 0;

  75.         if(!SetCommTimeouts(hSerPort, &tmOuts))
  76.         {
  77.                 return FALSE;
  78.         }

  79.         //指定端口监测的事件集
  80.         //SetCommMask (hSerPort, EV_RXCHAR);
  81.        
  82.         //分配设备缓冲区
  83.         //SetupComm(hSerPort, 10, 10);

  84.         //初始化缓冲区中的信息
  85.         PurgeComm(hSerPort, PURGE_TXCLEAR | PURGE_RXCLEAR);
  86.         return TRUE;
  87. }

  88. DWORD SendThread (PVOID pArg)
  89. {
  90.         TCHAR szText[TEXTSIZE];
  91.         TCHAR szDlg[128];
  92.         DWORD dwLen;
  93.         BOOL stat, start;
  94.         HWND hWnd = (HWND)pArg;

  95.         start = TRUE;
  96.         while(1)
  97.         {
  98.                 Sleep(5000);
  99.                 if(fContinue)
  100.                 {
  101.                         if(!fContinue)//这句话是浪费的,大家不用管
  102.                                 break;

  103.                         if(start)
  104.                         {
  105.                                 lstrcat(szText, TEXT("ATE0\r"));
  106.                                 start = FALSE;
  107.                                 wsprintf(szDlg, TEXT("Sended ATE0. \r\n"));
  108.                                 UpdateHistory((LPARAM)szDlg);
  109.                         }
  110.                         else
  111.                         {
  112.                                 lstrcat(szText, TEXT("AT\r"));
  113.                                 //显示发送的数据
  114.                                 wsprintf(szDlg, TEXT("Sended AT.\r\n"));
  115.                                 UpdateHistory((LPARAM)szDlg);
  116.                         }

  117.                         PurgeComm(hSerPort, PURGE_TXCLEAR | PURGE_RXCLEAR);        //发送之前先清空输入输出缓冲区
  118.                         stat = WriteFile (hSerPort, szText, lstrlen (szText)*sizeof (TCHAR), &dwLen, 0);

  119.                         if(!stat)
  120.                         {
  121.                                 wsprintf(szDlg, TEXT("Send ERROR!!\r\n"));
  122.                                 UpdateHistory((LPARAM)szDlg);
  123.                                 return 0;
  124.                         }
  125.                 }
  126.                 else
  127.                         break;
  128.         }
  129.         return 0;
  130. }

  131. DWORD ReadThread (PVOID pArg)
  132. {
  133.         //BYTE szText[TEXTSIZE];
  134.         //COMSTAT comstat;

  135.         //SetCommMask (hSerPort, EV_RXCHAR);
  136.         while (fContinue)
  137.         {
  138.                 /*
  139.                 if(ReadFile(hSerPort, szText, 10, &dwLength, NULL))
  140.                 {
  141.                         if(dwLength != 0)
  142.                         {
  143.                                 TCHAR dlg[128];
  144.                                 wsprintf(dlg, TEXT("received %d bytes.\r\n"), dwLength);
  145.                                 UpdateHistory((LPARAM)dlg);
  146.                                 UpdateHistory((LPARAM)szText);
  147.                         }
  148.                 }*/

  149.                 /*************************************************
  150.                 DWORD dwError, dwLength;
  151.                 COMSTAT comstat;

  152.                 ClearCommError(hSerPort, &dwError, &comstat);
  153.                 if(comstat.cbInQue > 0)
  154.                 {
  155.                         ReadFile(hSerPort, &szText, comstat.cbInQue, &dwLength, 0);
  156.                        
  157.                         //保存数据
  158.                         TCHAR *tmp = new TCHAR[iCount + 1];
  159.                         if(tmp == NULL)
  160.                                 return -1;

  161.                         TCHAR dlg[128];
  162.                         wsprintf(dlg, TEXT("received %d bytes.\r\n"), comstat.cbInQue);
  163.                         UpdateHistory((LPARAM)dlg);
  164.                         memcpy(tmp, szText, iCount);
  165.                         lstrcat(tmp, TEXT("\r\n"));
  166.                         UpdateHistory((LPARAM)tmp);
  167.                         PurgeComm(hSerPort, PURGE_RXCLEAR);
  168.                 }
  169.                
  170.                 Sleep(1);*/
  171.                 //**************************************************/
  172.                 //DWORD dwCommStatus;
  173.                 //WaitCommEvent(hSerPort, &dwCommStatus, 0);
  174.                 //SetCommMask (hSerPort, EV_RXCHAR);
  175.                 //PurgeComm(hSerPort, PURGE_RXCLEAR);
  176.                 //memset(szText, 0, sizeof(szText));
  177.                 TCHAR szText[TEXTSIZE];
  178.                 BYTE rByte;        //接收到的一个字节
  179.                 DWORD dwLength;        //实际接收的字节数
  180.                 INT iCount=0;
  181.                 TCHAR tch;

  182.                 do
  183.                 {
  184.                         ReadFile(hSerPort, &rByte, 1, &dwLength, 0);
  185.                         if(dwLength == 1)
  186.                         {
  187.                                 szText[iCount] = rByte;
  188.                                 iCount ++;

  189.                                 tch = (tch << 8) & 0xff00;
  190.                                 if (tch == TEXT ('\n'))
  191.                                         break;
  192.                                 //if(iCount >= TEXTSIZE)
  193.                                 //{
  194.                                 //        return -1;//缓冲区满
  195.                                 //}
  196.                         }
  197.                 }while(dwLength == 1);

  198.                 //ClearCommError(hSerPort,&dwReadErrors,&cmState);//清除错误标志并得到串口状态

  199.                 //PurgeComm(hSerPort, PURGE_RXCLEAR);

  200.                 if(iCount == 0)
  201.                 {
  202.                         //Sleep(100);
  203.                         continue;        //没接收到数据,继续下次循环
  204.                 }

  205.                 //保存数据
  206.                 TCHAR dlg[128];
  207.                 wsprintf(dlg, TEXT("received %d bytes.\r\n"), iCount);
  208.                 UpdateHistory((LPARAM)dlg);

  209.                 TCHAR *tmp = new TCHAR[iCount + 1];
  210.                 if(tmp == NULL)
  211.                         return -1;

  212.                 memcpy(tmp, szText, iCount);
  213.                 lstrcat(tmp, TEXT("\r\n"));
  214.                 UpdateHistory((LPARAM)tmp);

  215.                 //iCount = 0;
  216.                 //Sleep(100);
  217.         }
  218.         return 0;
  219. }
复制代码



问题:
1. ReadThread能够读取数据,但就算我每5秒发送一次AT命令,接收回来的应该只有OK才对,实际上回来的不止一个OK,几乎每次接收到的数据是上次接收到的数据的2倍,这究竟是个啥原因??
2. 虽然读取到了数据,但却是在发送了N个AT命令之后才开始出来数据,这跟网上他们发的那个测试程序完全不一样(那个是发一个AT随即回来一个OK的,而且每次发了AT只回来一个OK,我的发一个能回来N个OK....),我的代码错在哪里呢?

最新回复

关注 接分  详情 回复 发表于 2008-5-1 15:16
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
沉得好快.....
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
GetCommTimeouts(hSerPort, &tmOuts);
    tmOuts.ReadIntervalTimeout = MAXDWORD;  
    tmOuts.ReadTotalTimeoutConstant = MAXDWORD;
    tmOuts.ReadTotalTimeoutMultiplier = MAXDWORD;
    tmOuts.WriteTotalTimeoutConstant = 0;
    tmOuts.WriteTotalTimeoutMultiplier = 0;
改成这样看下
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

4
 
关注 接分
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表