天嵌 ARM开发社区

 找回密码
 注册
查看: 2245|回复: 4

wince 串口通信问题

[复制链接]
chenweignag 发表于 2012-11-4 10:32:12 | 显示全部楼层 |阅读模式
在wince上MFC做了一个接收数据的对话框,发现与PC机通信串口不能用,有几个问题:1、在PC机上用在网上下的调试助手往wince上发数据,不能接收。配置都没有错,用的波特率是9600.2、在CreatFile时发现不能用UART0对应的COM1: 而COM2:能CreateFile 这是为什么?天嵌的高手帮帮我这个新手

PortDCB.DCBlength = sizeof (DCB);     

       //得到端口的默认设置信息
       GetCommState (m_hSerial, &PortDCB);

       //改变DCB结构设置
       PortDCB.BaudRate = CBR_9600;                                //波特率
       PortDCB.fParity = FALSE;                                                //无奇偶校验
       PortDCB.fNull = TRUE;                                        //设为TRUE将使串行驱动程序忽略收到的空字节
       PortDCB.ByteSize = 8;                                                //每字节的位数
       PortDCB.Parity = NOPARITY;                                        //无奇偶校验
       PortDCB.StopBits = ONESTOPBIT;                                //每字节一位停止位

       //根据DCB结构配置端口
       if (!SetCommState (m_hSerial, &PortDCB))
       {
               dwError = GetLastError ();
                          //不能配置串行端口
              MessageBox (_T("配置串口失败"),  _T("错误"), MB_OK | MB_ICONWARNING);
            
              return FALSE;
       }
           COMMTIMEOUTS        CommTimeouts;
           GetCommTimeouts(m_hSerial,&CommTimeouts);
           CommTimeouts.ReadIntervalTimeout = 10/*MAXDWORD*/;
           CommTimeouts.ReadTotalTimeoutMultiplier = 10;
       CommTimeouts.ReadTotalTimeoutConstant = 10;   
       CommTimeouts.WriteTotalTimeoutMultiplier = 50;
       CommTimeouts.WriteTotalTimeoutConstant = 100;  
          //创建一个从串口读取数据的线程
       if (hReadThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ReadPortThread, this, 0, &dwThreadID))
       {
       }

//读数据线程
void   ReadPortThread(LPVOID lpvoid)
{
       CserialDlg * Dlg        = (CserialDlg*)lpvoid;
       BOOL fReadState;
       DWORD dwCommModemStatus;

       DWORD dwLength;
       COMSTAT ComStat;
       DWORD dwErrorFlags;

           BYTE   Byte;
           char    ReceiveBuf[10];
           DWORD   dwBytes;
           int    iCounter = 0;

       while (Dlg->m_hSerial != INVALID_HANDLE_VALUE)
       {
           //等待串口的事件发生
                   WaitCommEvent (Dlg->m_hSerial, &dwCommModemStatus, 0);

              if (dwCommModemStatus & EV_RXCHAR)
                          {
                                  //Sleep(100);               
                                  ClearCommError(Dlg->m_hSerial,&dwErrorFlags,&ComStat);
                 //cbInQue返回输入缓冲区中的字符数
                 dwLength=ComStat.cbInQue;

                 if(dwLength>0)
                 {
                    //从串口读取数据
                                         do
                                         {
                                                fReadState=ReadFile(Dlg->m_hSerial,&Byte,1,&dwBytes,NULL);
                                                if(!fReadState)
                                                {
                                  
                                                //不能从串口读取数据
                                                MessageBox(NULL,TEXT("无法读取数据"),TEXT("错误"),MB_OK);
                                                       
                                                }
                                                                                                       
                                                if(dwBytes==1)
                                                {
                                                        ReceiveBuf[iCounter++] = Byte;
                                                        if(iCounter == 10)
                                                        {
                                                                iCounter=0;
                                                        }
                                                        //赋给全局变量
                                                        strInChar=ReceiveBuf;
                                                }
                                         }while (dwBytes == 1);
      
                    }     
                 }
              
              GetCommModemStatus (Dlg->m_hSerial, &dwCommModemStatus);
             }

}
 楼主| chenweignag 发表于 2012-11-4 10:33:57 | 显示全部楼层
在把PC机上的调试助手发个图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| chenweignag 发表于 2012-11-4 18:49:24 | 显示全部楼层

wince 与PC机通信问题 求解

在wince上MFC做了一个接收数据的对话框,发现与PC机通信串口不能用,有几个问题:1、在PC机上用在网上下的调试助手往wince上发数据,不能接收。配置都没有错,用的波特率是9600.2、在CreatFile时发现不能用UART0对应的COM1: 而COM2:能CreateFile 这是为什么?天嵌的高手帮帮我这个新手

PortDCB.DCBlength = sizeof (DCB);     

       //得到端口的默认设置信息
       GetCommState (m_hSerial, &PortDCB);

       //改变DCB结构设置
       PortDCB.BaudRate = CBR_9600;                                //波特率
       PortDCB.fParity = FALSE;                                                //无奇偶校验
       PortDCB.fNull = TRUE;                                        //设为TRUE将使串行驱动程序忽略收到的空字节
       PortDCB.ByteSize = 8;                                                //每字节的位数
       PortDCB.Parity = NOPARITY;                                        //无奇偶校验
       PortDCB.StopBits = ONESTOPBIT;                                //每字节一位停止位

       //根据DCB结构配置端口
       if (!SetCommState (m_hSerial, &PortDCB))
       {
               dwError = GetLastError ();
                          //不能配置串行端口
              MessageBox (_T("配置串口失败"),  _T("错误"), MB_OK | MB_ICONWARNING);
            
              return FALSE;
       }
           COMMTIMEOUTS        CommTimeouts;
           GetCommTimeouts(m_hSerial,&CommTimeouts);
           CommTimeouts.ReadIntervalTimeout = 10/*MAXDWORD*/;
           CommTimeouts.ReadTotalTimeoutMultiplier = 10;
       CommTimeouts.ReadTotalTimeoutConstant = 10;   
       CommTimeouts.WriteTotalTimeoutMultiplier = 50;
       CommTimeouts.WriteTotalTimeoutConstant = 100;  
          //创建一个从串口读取数据的线程
       if (hReadThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ReadPortThread, this, 0, &dwThreadID))
       {
       }

//读数据线程
void   ReadPortThread(LPVOID lpvoid)
{
       CserialDlg * Dlg        = (CserialDlg*)lpvoid;
       BOOL fReadState;
       DWORD dwCommModemStatus;

       DWORD dwLength;
       COMSTAT ComStat;
       DWORD dwErrorFlags;

           BYTE   Byte;
           char    ReceiveBuf[10];
           DWORD   dwBytes;
           int    iCounter = 0;

       while (Dlg->m_hSerial != INVALID_HANDLE_VALUE)
       {
           //等待串口的事件发生
                   WaitCommEvent (Dlg->m_hSerial, &dwCommModemStatus, 0);

              if (dwCommModemStatus & EV_RXCHAR)
                          {
                                  //Sleep(100);               
                                  ClearCommError(Dlg->m_hSerial,&dwErrorFlags,&ComStat);
                 //cbInQue返回输入缓冲区中的字符数
                 dwLength=ComStat.cbInQue;

                 if(dwLength>0)
                 {
                    //从串口读取数据
                                         do
                                         {
                                                fReadState=ReadFile(Dlg->m_hSerial,&Byte,1,&dwBytes,NULL);
                                                if(!fReadState)
                                                {
                                 
                                                //不能从串口读取数据
                                                MessageBox(NULL,TEXT("无法读取数据"),TEXT("错误"),MB_OK);
                                                        
                                                }
                                                                                                        
                                                if(dwBytes==1)
                                                {
                                                        ReceiveBuf[iCounter++] = Byte;
                                                        if(iCounter == 10)
                                                        {
                                                                iCounter=0;
                                                        }
                                                        //赋给全局变量
                                                        strInChar=ReceiveBuf;
                                                }
                                         }while (dwBytes == 1);
      
                    }     
                 }
              
              GetCommModemStatus (Dlg->m_hSerial, &dwCommModemStatus);
             }

}
 楼主| chenweignag 发表于 2012-11-4 18:50:04 | 显示全部楼层
所用串口调试助手截图如下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
TQ-lkp 发表于 2012-11-5 09:21:21 | 显示全部楼层
本帖最后由 TQ-lkp 于 2012-11-5 09:21 编辑

COM1调试串口,你如果想用来开发要烧与 NK_no_debug版本的
我们提供了串口的源码:http://www.armbbs.net/forum.php? ... ince%2B%B4%AE%BF%DA
另外,严禁重复发帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-19 20:42 , Processed in 1.062500 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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