紧急求助:WinCE串口奇怪的问题,能发不能收

hawkzhao 2010-10-30 08:27:44
在wince5.0,用的是EVC进行操作,初始化串口后,能发送数据,但是收不到数据,找了几天了,没有找到问题,请各位大侠帮忙分析一下,谢谢!

串口初始化函数
DWORD dwReadErrors;
COMSTAT cmState;

if(m_hComm==INVALID_HANDLE_VALUE)
{
m_hComm=CreateFile(Port,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(m_hComm==INVALID_HANDLE_VALUE )
{
AfxMessageBox(_T("无法打开端口!请检查是否已被占用。"));
return FALSE;
}
GetCommState(m_hComm,&dcb);
dcb.BaudRate=BaudRate;
dcb.ByteSize=DataBits;
dcb.Parity=Parity;
dcb.StopBits=StopBits;
dcb.fParity=FALSE;
dcb.fBinary=TRUE;
dcb.fOutX=dcb.fInX=dcb.fTXContinueOnXoff=0;
dcb.fRtsControl=0;
dcb.fDtrControl=0;

//设置状态参数
//SetCommMask(m_hComm,EV_RXCHAR|EV_TXEMPTY);
SetupComm(m_hComm,16384,16384);
if(!SetCommState(m_hComm,&dcb))
{
AfxMessageBox(_T("无法按当前参数配置端口,请检查参数!"));
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
ClosePort();
return FALSE;
}

//设置超时参数
GetCommTimeouts(m_hComm,&CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout=10;
CommTimeOuts.ReadTotalTimeoutMultiplier=1;
CommTimeOuts.ReadTotalTimeoutConstant=10;
CommTimeOuts.WriteTotalTimeoutMultiplier=0;
CommTimeOuts.WriteTotalTimeoutConstant=0;
if(!SetCommTimeouts(m_hComm,&CommTimeOuts))
{
AfxMessageBox(_T("无法设置超时参数!"));
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
ClosePort();
return FALSE;
}

PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
ClearCommError(m_hComm,&dwReadErrors,&cmState);


return TRUE;

}

写函数:

DWORD CPSerialPort::WritePort(unsigned char *data,int length)
{
if(m_hComm==INVALID_HANDLE_VALUE)
{
return 0;
}

BOOL fWriteState;
DWORD dwBytesWritten=0;

fWriteState=WriteFile(m_hComm,data,length*sizeof(char),&dwBytesWritten,NULL);

return dwBytesWritten;
}

读函数

DWORD CPSerialPort::ReadPort(char *data,int length)
{
BOOL fReadState;
DWORD dwLength,dwBytesRead;
int TimeOutCount;
DWORD dwReadErrors;
COMSTAT cmState;


dwBytesRead=0;
TimeOutCount=0;


while(m_hComm!=INVALID_HANDLE_VALUE)
{

char* buf=new char[length];


fReadState=ReadFile(m_hComm,data,length,&dwLength,NULL);
if(!fReadState)
{
break;
}
else
{
dwBytesRead+=dwLength;
data+=dwLength;
}
if(dwBytesRead==((DWORD)length))
{
break;
}
if(dwLength!=0)
{
TimeOutCount=0;
}
else
{
TimeOutCount++;
Sleep(5);
}
if(TimeOutCount==8)
{
break;
}

}
return dwBytesRead;
}


我的程序调用
if (opencom==FALSE)
{

opencom=m_pSerial->OpenPort(portname,BaudRate,DataBits,StopBits,Parity,NULL,(DWORD)this);
if(!opencom)
{
AfxMessageBox(L"串口打开有错误,请确认硬件没有问题!");
}

}

for(i=0;i<IDNumber;i++)
{
gbrule->MakePackage(MeterAddr,DataID[i],&senddata[0]);
dwCharToWrite=strlen(senddata)+2;

buf[0]=0xFE;
buf[1]=0xFE;

for(j=0;j<14;j++)
buf[j+2]=senddata[j];


for(j=0;j<retrytimes;j++)
{
dwByteWritten = m_pSerial->WritePort(buf,dwCharToWrite);

if(dwByteWritten==0)
{
AfxMessageBox(_T("无法向端口写入数据!"));
}

//Sleep(10);

m_pSerial->ReadPort(recdata,dwCharToWrite+6);
if(gbrule->ParsePackage(MeterAddr,DataID[i],DataLen,DataType,recdata,&idvalue[i])==0)
{
break;
}
memset(recdata,'\0',sizeof(recdata));
}

和PC串口通讯总是收不到数据

更正:
不是收不到数据,是收到乱码?应该不是波特率不对吧,PC的串口都能收到正确的数据!



...全文
82 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawkzhao 2010-11-03
  • 打赏
  • 举报
回复
在读函数里面在每次break出来前一定要delete[] buf这样才不会出问题!
hawkzhao 2010-10-31
  • 打赏
  • 举报
回复
是打开串口与关闭串口.但是把PDA本身的串口收发短接起来就可以收到我发出的数据,并且是正常的!
hawkzhao 2010-10-31
  • 打赏
  • 举报
回复
我的是主程序new的,程序退出的时候才delete,其它应用窗体只是打开串口与关闭窗口.主要就是收到的不是目标值,像乱码一样
zgl7903 2010-10-30
  • 打赏
  • 举报
回复
你的程序可能会有一些内存泄漏, 每次读都有一个new操作,但是又没有delete释放操作

在ReadFile读入成功后加入一个TRACE,把接收到的数据输出到调试窗口里看看,是不是目标值
hawkzhao 2010-10-30
  • 打赏
  • 举报
回复
但是我把串口的收发短接可以收到我发出的数据.

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧