1、在从EDIT框向串口写数据时并用LISTBOX显示,接收的字符串被读出后,串口缓冲区中还有东西,它能使消息被触发,但收到的是空字符之类的东西。只好再判断一次,问为什么。
2、在从串口中读数据时,如V0600212Csxs,放到CString中,再用.left和.right将其分解为V0600212C和sxs两部分,可在向串口发送比较慢时,显示正常,如果数据比较快时数据就变成一个不知道的字符和V相结合的汉字开头,如“邓0600212和Csxs两部分部为什么。
3、从dos向串口向来的字符串,在显示时不正常,但有时将计算的字符个数加几后就能正常显示但有一个断言错误,不知什么准确计算字符数,尤其是CString类的变量。什么知道我得的数据是接收时就不收,还是显示的错,(因为同样的数据从window 下发接收正常)。
附码(有点长了,对不起,不想看就略过吧)
void CSxscomDlg::OnOpen() 
{
// TODO: Add your control notification handler code here
if(!OpenConnection())
AfxMessageBox("Can't open connection");

}void CSxscomDlg::OnSend() 
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
//PurgeComm(m_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteComm((LPSTR)(LPCTSTR)m_editsend,m_editsend.GetLength()+2);//+2);
}void CSxscomDlg::OnCls() 
{
// TODO: Add your control notification handler code here
CloseConnection();
int msgcount=0;
msgcount=m_list.GetCount();
for(int i=0;i<=msgcount;i++)
{
m_list.DeleteString(0);
}
}void CSxscomDlg::OnCancel() 
{
// TODO: Add extra cleanup here

CDialog::OnCancel();
}BOOL CSxscomDlg::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
m_pSet = &m_zhiliaoSet;
if(m_pSet->IsOpen())
{
m_pSet->Close();
}
m_pSet->Open();
m_bConnected=FALSE;
m_pThread=NULL;
m_nBaud=1200;
m_nDataBits=8;
m_bEcho=FALSE;
m_nFlowCtrl=0;
m_bNewLine=FALSE;
m_nParity=0;
m_sPort="COM1";
m_nStopBits=0; if((m_hPostMsgEvent=CreateEvent(NULL,TRUE,TRUE,NULL))==NULL)
return FALSE;
memset(&m_osRead,0,sizeof(OVERLAPPED));
memset(&m_osWrite,0,sizeof(OVERLAPPED));
if((m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL)
return FALSE;

return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CSxscomDlg::ConfigConnection()
{
DCB dcb;
if(!GetCommState(m_hCom,&dcb))
return FALSE;
dcb.fBinary=TRUE;
dcb.BaudRate=m_nBaud;
dcb.ByteSize=m_nDataBits;
dcb.fParity=TRUE;
switch(m_nParity)
{
case 0:dcb.Parity=NOPARITY;
break;
case 1:dcb.Parity=EVENPARITY;
break;
case 2:dcb.Parity=ODDPARITY;
break;
default:
;
}
switch(m_nStopBits)
{
case 0:dcb.StopBits=ONESTOPBIT;
break;
case 1:dcb.StopBits=ONE5STOPBITS;
break;
case 2:dcb.StopBits=TWOSTOPBITS;
break;
default:
;
}
dcb.fOutxCtsFlow=m_nFlowCtrl==1;
dcb.fRtsControl=m_nFlowCtrl==1?
RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;
dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;
dcb.XonChar=XON;
dcb.XoffChar=XOFF;
dcb.XonLim=50;
dcb.XoffLim=50;
return SetCommState(m_hCom,&dcb);
}
BOOL CSxscomDlg::OpenConnection()
{
COMMTIMEOUTS TimeOuts; if(m_bConnected)
return FALSE;
m_hCom=CreateFile(m_sPort,GENERIC_READ|GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(m_hCom==INVALID_HANDLE_VALUE)
return FALSE;
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
SetCommMask(m_hCom,EV_RXCHAR); TimeOuts.ReadIntervalTimeout=0xFFFFFFFF;//1000;//MAXDWORD;////
TimeOuts.ReadTotalTimeoutMultiplier=0;//500;////
TimeOuts.ReadTotalTimeoutConstant=0;//0;//5000;//
TimeOuts.WriteTotalTimeoutMultiplier=50;//500;//500;//
TimeOuts.WriteTotalTimeoutConstant=2000;//5000;//1000;//2000;
SetCommTimeouts(m_hCom,&TimeOuts);
if(ConfigConnection())
{
PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
m_pThread=AfxBeginThread(CommProc,this,THREAD_PRIORITY_NORMAL,
0,CREATE_SUSPENDED,NULL);
if(m_pThread==NULL)
{
CloseHandle(m_hCom);
return FALSE;
}
else
{
m_bConnected=TRUE;
m_pThread->ResumeThread();
}
}
else
{
CloseHandle(m_hCom);
return FALSE;
}
return TRUE;
} void CSxscomDlg::CloseConnection()
{
if(!m_bConnected)return;
m_bConnected=FALSE;
SetEvent(m_hPostMsgEvent);
SetCommMask(m_hCom,0);
WaitForSingleObject(m_pThread->m_hThread,INFINITE);
m_pThread=NULL;
CloseHandle(m_hCom);
}
DWORD CSxscomDlg::ReadComm(char* buf,DWORD dwLength)
{
BOOL fState;
DWORD length=0;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
length=min(dwLength,ComStat.cbInQue);
fState=ReadFile(m_hCom,buf,length,&length,&m_osRead);
//if(fState)
//{
// if(GetLastError()==ERROR_IO_PENDING)
// {
// WaitForSingleObject(m_osRead.hEvent,20000);
//PurgeComm(m_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return length;
}
DWORD CSxscomDlg::WriteComm(char *buf,DWORD dwLength)
{
BOOL fState;
DWORD length=dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite);

/*if(fState)
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);
return length;
}
//return (0);
}*/
return length;
} UINT CommProc(LPVOID pParam)
{
OVERLAPPED os;
DWORD dwMask,dwTrans;
COMSTAT ComStat;
CSxscomDlg *pdlg=(CSxscomDlg*)pParam;
DWORD dwErrorFlags;
PurgeComm(pdlg->m_hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(os.hEvent==NULL)
{
AfxMessageBox("Can't create event lbjectQ");
return(UINT)-1;
}
while(pdlg->m_bConnected)
{
    ClearCommError(pdlg->m_hCom,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue>1)
{
WaitForSingleObject(pdlg->m_hPostMsgEvent,INFINITE);
ResetEvent(pdlg->m_hPostMsgEvent);
pdlg->PostMessage(WM_COMMNOTIFY,EV_RXCHAR,0);
//PurgeComm(pdlg->m_hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
continue;
}
dwMask=0;
/*WaitCommEvent(pdlg->m_hCom,&dwMask,&os);
if((dwMask & EV_RXCHAR)==EV_RXCHAR)
{
GetOverlappedResult(pdlg->m_hCom,&os,&dwTrans,TRUE);
pdlg->PostMessage(WM_COMMNOTIFY,EV_RXCHAR,0);
}*/
if(!WaitCommEvent(pdlg->m_hCom,&dwMask,&os))
{
if(GetLastError()==ERROR_IO_PENDING)
{

GetOverlappedResult(pdlg->m_hCom,&os,&dwTrans,TRUE);
}
else
{
CloseHandle(os.hEvent);
return (UINT)-1;
}
}

}
CloseHandle(os.hEvent);
return 0;
}LRESULT CSxscomDlg::OnCommNotify(WPARAM wParam,LPARAM lParam)
{
char buf[MAXBLOCK/4];
CString str="";
CString str1="",str2="",str3="",str4="";
int nLength;
if(!m_bConnected||(wParam & EV_RXCHAR)!=EV_RXCHAR)
{
SetEvent(m_hPostMsgEvent);
return 0L;
} nLength=ReadComm(buf,100);
PurgeComm(m_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
if(nLength)
{
/*for(int j=0;j<9;j++)
{
str1+=buf[j];
}*/
for(int i=0;i<nLength;i++)
{
switch(buf[i])
{
case '\r':
break;
case '\n':
break;
case '\x0e':
break;
case '\x0f':
break;
case '\0':
break;
default:
str+=buf[i];
}
}
if(str!="")
{
str1=str.Left(9); m_pSet->m_strFilter="addcode=?";
m_pSet->m_TEMP=str1;
m_pSet->Requery();
    m_pSet->m_TEMP = _T("");
m_list.AddString(str1);
m_list.AddString(m_pSet->m_gsmcode);
str2=str.Right (str.GetLength()-9);
m_list.AddString(str2);
}
}
str.Empty();
str1.Empty();
str2.Empty();
SetEvent(m_hPostMsgEvent);

解决方案 »

  1.   

    这样吧
    我给你一个串口类
    写串口的
    随你发什么都可以
    还友情送一个例程
    一个通过串口聊天的程式如何?你要告诉俺您是如何用计算机发传呼的有意就发 Email: [email protected]
      

  2.   

    给我也发一个:[email protected]谢谢!
      

  3.   

    大哥你的问题写得也太乱了点儿,看得真费劲。
    以下是愚见:
    CString中一个字符是用两个字节表示的,
    所以你这样转化应该是有问题(在CE下是肯定有问题的)
    WriteComm((LPSTR)(LPCTSTR)m_editsend,m_editsend.GetLength()+2);
    (LPSTR)(LPCTSTR)m_editsend,仔细想想它在内存中是怎么回事!
    后面估计也有这样的问题存在,我没有仔细看。
    ================================================================曾经有一碗热辣辣的烧猪手面放在我面前,我没有珍惜,等到晾凉了之后才后悔莫及。
      

  4.   

    to:Jerry529(在猪的海洋里遨游转化应该出了什么问题?,它在内存中到底是怎么回事?
    帮忙仔细分析分析!!!!谢谢谢!!!!
      

  5.   

    你的程序是使用unicode编译的吗?另外这里可能有点问题。void CSxscomDlg::OnSend() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(TRUE);
    //PurgeComm(m_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
    WriteComm((LPSTR)(LPCTSTR)m_editsend,m_editsend.GetLength()+2);//+2);
    }怎么有两次类型转换?另外length为什么是+2?
    建议将writeComm第一个参数改为LPCSTR类型
    该行改为
    writeComm((LPCSTR)m_editsend,m_editsend.GetLength()+1);nLength=ReadComm(buf,100);下面的东西也写得比较奇怪···不过我并不知道你串口通讯的具体协议格式,有什么问题我也不好说
      

  6.   

    WriteFile(...)第一个参数好象不支持CString对象,m_editsend是EDIT对应的变量是CString的,我有((LPSTR)(LPCTSTR)m_editsend将它变成char *型的,
    用writeComm((LPCSTR)m_editsend,m_editsend.GetLength()+1);如果发送的数据是
    "V0600212Csxs123"的话,接收并显示就成了
    V0600212Csxs12
    3
    而加2就正常了。
    V0600212C123
    这为什么。
    nLength=ReadComm(buf,100);下面的东西我是想将字符串中的控制字符去掉,再将它分解为V0600212C和sxs123两部分,并通过V0600212C从数据库中查到对应的数据并显示。所以有这些问题:
    1、在从EDIT框向串口写数据时并用LISTBOX显示,接收的字符串被读出后,串口缓冲区中还有东西,它能使消息被触发,但收到的是空字符之类的东西。只好再判断一次,问为什么。
    2、在从串口中读数据时,如V0600212Csxs,放到CString中,再用.left和.right将其分解为V0600212C和sxs两部分,可在向串口发送比较慢时,显示正常,如果数据比较快时数据就变成一个不知道的字符和V相结合的汉字开头,如“邓0600212和Csxs两部分部为什么。
    3、从dos向串口向来的字符串,在显示时不正常,但有时将计算的字符个数加几后就能正常显示但有一个断言错误,不知什么准确计算字符数,尤其是CString类的变量。什么知道我得的数据是接收时就不收,还是显示的错,(因为同样的数据从window 下发接收正常)。请版主帮帮我!!!!!!!!!!!!!!!!
      

  7.   

    还是先看看我原来发表的一个原码文章吧http://www.csdn.net/develop/read_article.asp?id=9356
      

  8.   

    writeFile第一个参数是LPCVOID类型,所以把CString转换为LPCSTR救可以了。看情况应该是你发送的格式不正确造成的问题。你可以试试在writecomm以前加上m_editsend+='\0';后面的length还是使用+1试试。因为你原来使用length+2时发送了一个未知字符(超过字符串的长度了)
    一般来说这个字符在内存没有被使用到的时候是0,当你多次send时,该字符很可能会被改变。所以在后面发送时会造成接受端数据错位。(2的现象就是典型的数据错位了)
    你是用串口与传呼通讯吗?应该有点资料说明发送数据的格式的把?
      

  9.   

    这么说吧:
    CString:一个字符串“ABC”,因为一个字符占两个字节,所以在内存中是0x00,0x41,0x00,0x42,0x00,0x43, 长度为六个字节;Char*:一个字符串“ABC”,一个字符一个字节,所以是0x41,0x42,0x43,
    长度是三个字节。也就是说如果你用(LPSTR)(LPTSTR)m_isenddata转换CString变量的化,得到的是字符串是“NUllANULLBNULLC”(NULL 表示空字符)现在明白了吗?
    ================================================================曾经有一碗热辣辣的烧猪手面放在我面前,我没有珍惜,等到晾凉了之后才后悔莫及。
      

  10.   

    楼上怎么乱说话那···
    Cstring又不是一定使用unicode的
      

  11.   

    谢谢版主,我用你的方法试一下,解决了重谢谢!
    也谢谢Jerry529(在猪的海洋里遨游),不过我没用unicode,我在win98下开发的,不支持unicode.数据不是0x00,0x41,0x00,0x42,0x00,0x43。也许版主是对的,我试试。多谢各位,可能还要麻烦各位。 
      

  12.   

    给我也发一个:
    [email protected]
    谢谢!