现在我的串口收发好像都是按照字符的。用的CSerialPort类。发送函数如下:
void CSerialPort::WriteToPort(LPCTSTR string)
{
assert(m_hComm != 0); memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
strcpy(m_szWriteBuffer, string);
m_nWriteSize=strlen(string); // set event for write
SetEvent(m_hWriteEvent);
}
接收函数如下:WPARAM ch ,是按照什么接收的?
afx_msg LONG OnCommunication(WPARAM ch,LPARAM port);
ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)
LONG CCE3GROUNDTESTDlg::OnCommunication(WPARAM ch, LPARAM port)
{
 }比如我要发送EB90,我希望实际上发送的是1110 1011 1001 0000。EB是高字节,90是低字节。EB90是一个字。

解决方案 »

  1.   

    用BYTE等接收下来数组,然后再处理
      

  2.   

    “1110 1011 1001 0000” 是字节流还是二进制流?如果是二进制流,直接
    char ch[] = {0xEB, 0x90, 0, 0};
    CSerialPort.WriteToPort(ch);
      

  3.   

    vcTiro:发文件的时候我是用二进制文件打开的。发数据的时候好像是字节流吧。再问一下:我把所有的数据转成16进制就可以了吧?但转换以后比如我要发送eb90 1234 5678 09d7,接收端仅显示4Vx。 我编的这个程序跟网上那个串口调试小助手很类似。
      

  4.   

    LZ是用多线程写的吧?
    要发送十六进制数,不懂LZ是怎么改的
    LZ去改一下WriteFile()函数噢void CSerialDlg::WriteChar(CSerialDlg *port){
    bResult=WriteFile(port->m_hComm ,port->m_szWriteBuffer ,port->m_nWriteSize ,
    &BytesSent,&port->myov );
    }
    添加stringtohex函数,
    发送十六进制数时,要先调用stringtohex函数之后再调用WriteToPort。
    具体的LZ到网上搜一下噢,蛮多资料的
    愿早日解决...
      

  5.   

    for(i = 0; i < nLen; i++)
    CString::Format(_T("%X"),buf[i]);
      

  6.   


    大小端是指位数在内存摆放的顺序,big endian还是little endian,如果是big endian就是高位在前,反之是低位在前。
    比如,一个整数int i = 999。十六进制是3e7 在big endian内存里面是00 00 03 e7,在little endian里面是e7 03 00 00,msdos windows都是little endian。如果你接收的数字是从big endian传来的,要转向。
      

  7.   

    接收端是一个一个BYTE接收的,接收顺序跟你发送的顺序一样。不管是十六进制还是十进制还是字符,发送的时候是按照字节发送的,比如你发送数组Buffer,则按顺序从buffer[0]发送,发送你指定字节的数据。m_CommPort.WriteToPort(buffer, 10),这样就发送10字节。如果你要按顺序发送EB 90,则按照顺序buffer[n]= 0xEB, buffer[n+1] = 0x90,想反你就反过来赋值。
      

  8.   

    谢谢各位,明白了不少。再问一下关于字符串转成char类型的问题,比如我在编辑框m_strSendData输入EB90,我怎么把字符串m_strSendData高两个字符EB转成十六进制0xeb,最后两个字符90转成十六进制0x90。
        m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90; 
      

  9.   

    itoa函数不行啊,我想把CString中的前两个字符组成一个字节放在char ch[]中。
     m_strSendData="EB90"  ->  char ch[0]=0xeb; ch[1]=0x90; 
      

  10.   

    int HexValue(unsigned char a)
    {
    a -= 48;
    if(a > 9 ) a -= 7;
    return a;
    }
    //
    ch[0]=HexValue('E')*16+HexValue('B');
    //
    int value=HexValue('E')*4096+HexValue('B')*256+HexValue('9')*16+HexValue('0');
      

  11.   

    for(i = 0; i < nLen; i++) 
    CString::Format(_T("%02X"),buf[i]);
      

  12.   

    其实很简单,你的CSerialPort类收发数据为字符,比如,对应发送单字节十六进制数据[1a],它按两个字符'1'和'a'来收发,实际上在WriteFile时发的是0x31和0x61。因此你在收时需要转换收的两个字符'1'和'a'到单字节十六进制数据[1a],发时需要将单字节十六进制数据转换到两个字符
      

  13.   

    谢谢各位,我没说太清楚。我希望在编辑框输入CString四个字符,比如EB90,如何将字符串高两个EB组成一个字节也就是11101011存在char ch[0]中,后两个字符串90作为一个字节10010000放在ch[1]中。
    m_strSendData="EB90"  ->  char ch[0]=0xeb; ch[1]=0x90; 
      

  14.   

    比如我在编辑框m_strSendData输入EB90,我怎么把字符串m_strSendData高两个字符EB转成十六进制0xeb,最后两个字符90转成十六进制0x90。 
        m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90;
      

  15.   

    我不是给你一个程序了,没看?
    “EB”=14*16+11=235=0xEB
      

  16.   

    schlafenhamster,谢谢你,我看了。可是我原来的类型是CString啊,而你给的参数是unsigned char 。m_strSendData是可以随便输入4个字符的,不是固定的
      

  17.   

    你可以自己写个函数转换。思路如下
    void StrToHex(CString str, char buf[2])
    {
       if (str.GetLength()!=4)
         return;
       for (int i=0; i<4; i++)
      {
    char ch = str.GetAt(i));
            int x = (i%2==0? 16:1);
            switch(ch )
           {
           case 'f':
           case 'F':
              buf[i/2] += 15*x;
              break;
           case 'e':
           case 'E':
              buf[i/2] += 14*x;
              break;
       其他的自己写吧  
           }
      }
    }