在线等!串口数据接收问题

时间:2021-04-30 17:40:55
我现在的程序是在wince6中,在S3c6410中调试没得问题,换了块板子,也是wince6的,不过是arm9内核的,接受数据就一次,以后就接受不到了,用wince串口调试工具,板子发送出来,pc机可以接收,pc机发送发给下位机接收不到,我的串口接收程序是这样的,在接收线程中
          while (TRUE)
{   
if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
{
SetCommMask (ceSeries->m_hComm, EV_RXCHAR| EV_CTS | EV_DSR);
//GetCommMask(ceSeries->m_hComm, &evtMask);
//表示串口 收到字符
if (evtMask & EV_RXCHAR)   
{
Sleep(10);
ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);

willReadLen = cmState.cbInQue ;

if (willReadLen <= 0)
{
continue;
}
readBuf = new BYTE[512];
ZeroMemory(readBuf,512);
//读取串口数据
ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0);
                              }
                      }
            }

20 个解决方案

#1


换的那块板子给的测试代码是开个线程,然后就一直运行,
while (TRUE) 
{  
readBuf = new BYTE[512]; 
ZeroMemory(readBuf,512); 
//读取串口数据 
ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0); 
......
}
就可以接受数据了,我的为什么就不可以呢,我的是等到有字符到就会触发啊,他的是一直在读串口

#2


建议楼主, 再重新上电,多测几次,看是否都是:第一次能收到,之后就再也收不到。

也有可能是PC的串口被烧坏了。

#3


不可能,我测试了一上午,两台PC,4个串口

#4


引用 1 楼 wswwxk 的回复:
换的那块板子给的测试代码是开个线程,然后就一直运行,
while (TRUE)

readBuf = new BYTE[512];
ZeroMemory(readBuf,512);
//读取串口数据
ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0);
......
}
就可以接受数据了,我的为什么就不可以呢,我的是等到有字符到就会触发啊,他的是一直在读串口


你可以先用他的那个程序测试下,看是否能收到?
如果能收到,就可以排除硬件问题。

如果还是收不到,那就是赢家问题, 比如232的PHY是否有问题等等


软件方面:

建议把:
if (willReadLen <= 0) 

continue; 

删掉,测试下、

#5


我把所有相关的都删了
if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
{
SetCommMask (ceSeries->m_hComm, EV_RXCHAR| EV_CTS | EV_DSR);
//GetCommMask(ceSeries->m_hComm, &evtMask);
//表示串口 收到字符
if (evtMask & EV_RXCHAR)   
{
Sleep(10);
ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);

willReadLen = cmState.cbInQue ;

if (willReadLen <= 0)
{
continue;
}
都没要了,
我程序中只有一下的了
while (TRUE)

 if(ReadFile(ceSeries->m_hComm, readBuf, 2, &actualReadLen,0));
 {
     if(..)
     {
           ReadFile(ceSeries->m_hComm, readBuf, 2, &actualReadLen,0);
     }
...................
}
还有读不到数据,没反应
 

#6


http://download.csdn.net/source/870333
你用这个试试看,如果也不行,基本可以推测是硬件或驱动的问题。

#7


也就是说 用:
while (TRUE) 
{  
readBuf = new BYTE[512]; 
ZeroMemory(readBuf,512); 
//读取串口数据 
ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0); 
...... 


也读不到数据?

如果是这样,就是你的开发板的串口有问题、

不过,你确认用上面那个程序 在你的板子行吗?

#8


我就是用的他在上面测试的,这个测试工具也是等待字符才接受数据,所以没反应

#9


QQ:604914729 ,要不QQ聊

你可以进行6410 提供的UART 接口的RXD 与TXD短接,看你自己发送数据,自己能否收到?

再就是在232_PHY后,既是把开发板上那个连接PC的串口上的TXD与RXD短接。,看你自己发送数据,自己能否收到?

#10


引用 7 楼 kyzf 的回复:
也就是说 用:
C/C++ codewhile (TRUE) 
{  
readBuf=new BYTE[512]; 
ZeroMemory(readBuf,512);//读取串口数据ReadFile(ceSeries->m_hComm, readBuf, willReadLen ,&actualReadLen,0); 
...... 
}

也读不到数据?

如果是这样,就是你的开发板的串口有问题、

不过,你确认用上面那个程序 在你的板子行吗?

这个代码可以,不过我的在mini2440和S3c6410中都正常啊,在他的板子上wince串口调试助手出现一样的问题,之前我还没有遇到过,看大家遇到没啊

#11


你用示波器测了RXD上有数据过来么?另外,建议你用16进制的方式显示数据看看。

#12


引用 11 楼 sunrain_hjb 的回复:
你用示波器测了RXD上有数据过来么?另外,建议你用16进制的方式显示数据看看。

示波器有数据,显示也是16进制的

#13


我前面遇到过一次这个bug,你确认下是不是这种现象:
如果上电后pc先发数据,板子可以接收,而一旦板子发送数据,板子就不能再接收pc的数据了。

如果是这种情况,基本可以判断是驱动的问题,在驱动的发送函数里面把使能发送中断的语句去掉就好。
SL_TxIntrEx这个函数里面的EnSubINT(pHWHead, pHWHead->bTxINT);这一句去掉。

#14


引用 13 楼 congyue123 的回复:
我前面遇到过一次这个bug,你确认下是不是这种现象:
如果上电后pc先发数据,板子可以接收,而一旦板子发送数据,板子就不能再接收pc的数据了。

如果是这种情况,基本可以判断是驱动的问题,在驱动的发送函数里面把使能发送中断的语句去掉就好。
SL_TxIntrEx这个函数里面的EnSubINT(pHWHead, pHWHead->bTxINT);这一句去掉。

他的程序收发都正常
我现在的问题主要是我的是等待串口事件,他的是一直查询串口,我怀疑他的串口驱动不支持等待事件

#15


正常来说串口的接收是中断的方式,如果你的驱动里面支持接收中断的话,用中断方式跟踪下。

#16


学习了。

#17


正在学习串口编程
mark

#18


你是同步方式打开还是异步方式,WINCE下是不支持异步的,我看你的程序好象是异步啊

#19


什么都不要删,将Sleep(10); 
改成Sleep(1);试看看

#20


我把程序改了,他的驱动不支持字符触发事件

#1


换的那块板子给的测试代码是开个线程,然后就一直运行,
while (TRUE) 
{  
readBuf = new BYTE[512]; 
ZeroMemory(readBuf,512); 
//读取串口数据 
ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0); 
......
}
就可以接受数据了,我的为什么就不可以呢,我的是等到有字符到就会触发啊,他的是一直在读串口

#2


建议楼主, 再重新上电,多测几次,看是否都是:第一次能收到,之后就再也收不到。

也有可能是PC的串口被烧坏了。

#3


不可能,我测试了一上午,两台PC,4个串口

#4


引用 1 楼 wswwxk 的回复:
换的那块板子给的测试代码是开个线程,然后就一直运行,
while (TRUE)

readBuf = new BYTE[512];
ZeroMemory(readBuf,512);
//读取串口数据
ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0);
......
}
就可以接受数据了,我的为什么就不可以呢,我的是等到有字符到就会触发啊,他的是一直在读串口


你可以先用他的那个程序测试下,看是否能收到?
如果能收到,就可以排除硬件问题。

如果还是收不到,那就是赢家问题, 比如232的PHY是否有问题等等


软件方面:

建议把:
if (willReadLen <= 0) 

continue; 

删掉,测试下、

#5


我把所有相关的都删了
if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
{
SetCommMask (ceSeries->m_hComm, EV_RXCHAR| EV_CTS | EV_DSR);
//GetCommMask(ceSeries->m_hComm, &evtMask);
//表示串口 收到字符
if (evtMask & EV_RXCHAR)   
{
Sleep(10);
ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);

willReadLen = cmState.cbInQue ;

if (willReadLen <= 0)
{
continue;
}
都没要了,
我程序中只有一下的了
while (TRUE)

 if(ReadFile(ceSeries->m_hComm, readBuf, 2, &actualReadLen,0));
 {
     if(..)
     {
           ReadFile(ceSeries->m_hComm, readBuf, 2, &actualReadLen,0);
     }
...................
}
还有读不到数据,没反应
 

#6


http://download.csdn.net/source/870333
你用这个试试看,如果也不行,基本可以推测是硬件或驱动的问题。

#7


也就是说 用:
while (TRUE) 
{  
readBuf = new BYTE[512]; 
ZeroMemory(readBuf,512); 
//读取串口数据 
ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0); 
...... 


也读不到数据?

如果是这样,就是你的开发板的串口有问题、

不过,你确认用上面那个程序 在你的板子行吗?

#8


我就是用的他在上面测试的,这个测试工具也是等待字符才接受数据,所以没反应

#9


QQ:604914729 ,要不QQ聊

你可以进行6410 提供的UART 接口的RXD 与TXD短接,看你自己发送数据,自己能否收到?

再就是在232_PHY后,既是把开发板上那个连接PC的串口上的TXD与RXD短接。,看你自己发送数据,自己能否收到?

#10


引用 7 楼 kyzf 的回复:
也就是说 用:
C/C++ codewhile (TRUE) 
{  
readBuf=new BYTE[512]; 
ZeroMemory(readBuf,512);//读取串口数据ReadFile(ceSeries->m_hComm, readBuf, willReadLen ,&actualReadLen,0); 
...... 
}

也读不到数据?

如果是这样,就是你的开发板的串口有问题、

不过,你确认用上面那个程序 在你的板子行吗?

这个代码可以,不过我的在mini2440和S3c6410中都正常啊,在他的板子上wince串口调试助手出现一样的问题,之前我还没有遇到过,看大家遇到没啊

#11


你用示波器测了RXD上有数据过来么?另外,建议你用16进制的方式显示数据看看。

#12


引用 11 楼 sunrain_hjb 的回复:
你用示波器测了RXD上有数据过来么?另外,建议你用16进制的方式显示数据看看。

示波器有数据,显示也是16进制的

#13


我前面遇到过一次这个bug,你确认下是不是这种现象:
如果上电后pc先发数据,板子可以接收,而一旦板子发送数据,板子就不能再接收pc的数据了。

如果是这种情况,基本可以判断是驱动的问题,在驱动的发送函数里面把使能发送中断的语句去掉就好。
SL_TxIntrEx这个函数里面的EnSubINT(pHWHead, pHWHead->bTxINT);这一句去掉。

#14


引用 13 楼 congyue123 的回复:
我前面遇到过一次这个bug,你确认下是不是这种现象:
如果上电后pc先发数据,板子可以接收,而一旦板子发送数据,板子就不能再接收pc的数据了。

如果是这种情况,基本可以判断是驱动的问题,在驱动的发送函数里面把使能发送中断的语句去掉就好。
SL_TxIntrEx这个函数里面的EnSubINT(pHWHead, pHWHead->bTxINT);这一句去掉。

他的程序收发都正常
我现在的问题主要是我的是等待串口事件,他的是一直查询串口,我怀疑他的串口驱动不支持等待事件

#15


正常来说串口的接收是中断的方式,如果你的驱动里面支持接收中断的话,用中断方式跟踪下。

#16


学习了。

#17


正在学习串口编程
mark

#18


你是同步方式打开还是异步方式,WINCE下是不支持异步的,我看你的程序好象是异步啊

#19


什么都不要删,将Sleep(10); 
改成Sleep(1);试看看

#20


我把程序改了,他的驱动不支持字符触发事件

#21