我用过,你可以参考,如下: CStdioFile Cfiler;
Cfiler.Open(_T("D:\\COM程序\\数据\\CELL1700-3.txt"),CFile::modeRead);
DWORD dwRead,dwPoslen=0,dwFileLen;
char cRead;
CString test;
dwFileLen=Cfiler.GetLength();
while(dwPoslen<dwFileLen)
{
Cfiler.Read(&dwRead,1);
cRead=(char)dwRead; 
test=cRead;
m_ctrlComm.SetOutput(COleVariant(test));
dwPoslen+=1;
Cfiler.Seek(dwPoslen,CFile::begin);
}
    Cfiler.Close();

解决方案 »

  1.   

    都不着边,sigh
    不用别的代码,如果用byte* 怎么能得到长度
      

  2.   

    用strcpy把串口缓冲区里的数据度出来看看,应该是把字符串结束标志\0和数字0区分开了的
      

  3.   

    WriteFile 中不是可以指定写入数据的长度吗?WriteFile(
    HANDLE hFile,     //串口句柄
    LPCVOID lpBuffer, //数据缓存指针
    DWORD nNumberOfBytesToWrite,   ////写入数据的字节数
    LPDWORD lpNumberOfBytesWriten,
    LPOVERLAPPED lpOverlapped
    );将CSerialPort类稍改一下,将你写入数据的字节数传给 nNumberOfBytesToWrite 不就行了,遇着0也可以传过去的。
      

  4.   

    我没用过这个类。要是遇到0就结束,你把所有的BYTE都加1发送,接受方收到再减1不就行了。但最大值要小于0xff
    不然就别用这个类了,用别的吧!! 
    OpenFile
    WriteFile 多好用。
      

  5.   

    我没用过这个类。要是遇到0就结束,你把所有的BYTE都加1发送,接受方收到再减1不就行了。但最大值要小于0xff
    不然就别用这个类了,用别的吧!! 
    OpenFile
    WriteFile 多好用。
      

  6.   

    里面就是 openfile 和 writefile 接受方部可能改变.
      

  7.   

    someone(阿风) 说得对,在调用WrtieFile时把数据的长度传给WriteFile函数中就不会有那样的问题了。
      

  8.   

    没错.
    你改写你下它的发送函数。如someone(阿风) 所说。函数增加一个数据长度参数,。
      

  9.   

    不是所有的0都要的,你的 char buffer[1024],除了前面的字符,后面都是0
    后面的不要
      

  10.   

    不是所有的0都要的,你的 char buffer[1024],除了前面的字符,后面都是0
    后面的不要
      

  11.   

    要发送的是你自己的数据,数据的格式及长度都是知道的啊,并不是说定义了一个1024字节的缓冲就要全都发出去。
    将缓冲的首地址传给lpBuffer,再将(有意义的数据)你实际要发送数据的长度传给nNumberOfBytesToWrite不就行了。
      

  12.   

    //如12 34 00 56
    DWORD dwSize;
    WriteFile(hCom, lpBuffer, 4, &dwSize, NULL);//4为你要发送的字节数
      

  13.   

    怎么给  lpBuffer 赋值呀 ahr(电磁波) lpbuffer="12 34 00 56"这样不行
    要把 int 值传给lpbuffer
      

  14.   

    lpbuffer 怎么赋值??要传int型数据
      

  15.   

    //例如 12,34,0, 56   这4个数, 每个占2字节
    int lpBuffer[] = {12, 34, 0, 56};
    DWORD dwSize;
    WriteFile(hCom, lpBuffer, 2*4, &dwSize, NULL);
      

  16.   

    BYTE  data[] = {0x12, 0x34, 0x00, 0x56};
    DWORD dwSize;
    OVERLAPPED ol;
    WriteFile(hCom, data, sizeof(data), &dwSize, &ol);
      

  17.   

    char CComtestView::ConvertCharTohex(char ch)
    {
    if(ch>='0'&&ch<='9')
    return ch-0x30;
    else if(ch>='A'&&ch<='F')
    return ch-'A'+10;
    else if(ch>='a'&&ch<='f')
    return ch-'a'+10;
    else
    return -1;
    }
    int CComtestView::String2Hex(CString str,char *hexstr)
    {
    /* if((Total % 2) != 0)
     {
      strcat((char *)lpBuffer,"0");
      Total ++;
     }
     unsigned char HexBuffer[1024];
     memset(HexBuffer,'\0',1024);
     int i ;
     for( i = 0 ; i < Total ; i++)
     {
    if(lpBuffer[i] > 0x39)
    lpBuffer[i] -= 0x37 ;
      else
    lpBuffer[i] -= 0x30 ;
     }
     for(i=0 ; i < Total ; i+=2)
     {
    HexBuffer[i/2] = lpBuffer[i] ;
    HexBuffer[i/2] <<= 4;
    HexBuffer[i/2] |= lpBuffer[i+1];
     }
    memcpy(lpBuffer,HexBuffer,Total/2);*/
    int i,len,n=0;
    char lowstr,highstr;
    len=str.GetLength();
    for(i=0;i<len;i++)
    {
    if(str[i]==' ')
    {
    continue;
    }
    highstr=ConvertCharTohex(str[i]);
    if(highstr>=0&&highstr<=16)
    {
    hexstr[n]=str[i];
    hexstr[n]<<=4; 
    i++;
    lowstr=ConvertCharTohex(str[i]);
    if(lowstr>=0&&lowstr<=16)
    {
    hexstr[n]|=lowstr;//如果是highstr,lowstr 都是0这个字符串就结束了.不再接受其他的字符
    n++;
    }
    }
    else
    {
    AfxMessageBox("超出数字范围");
    }
    }
    return true;
    }
    Saimen(全拼) 的程序我试了试也存在00H bug.谁能帮我把这函数搞定呀。分数可以在加
      

  18.   

    8.发送十六进制字符    在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND Caption: 十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend;    在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码; //由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
    //如:A1 23 45 0B 00 29
    //CByteArray是一个动态字节数组,可参看MSDN帮助
    int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata)
    {
    int hexdata,lowhexdata;
    int hexdatalen=0;
    int len=str.GetLength();
    senddata.SetSize(len/2);
    for(int i=0;i<len;)
    {
    char lstr,hstr=str[i];
    if(hstr==' ')
    {
    i++;
    continue;
    }
    i++;
    if(i>=len)
    break;
    lstr=str[i];
    hexdata=ConvertHexChar(hstr);
    lowhexdata=ConvertHexChar(lstr);
    if((hexdata==16)||(lowhexdata==16))
    break;
    else 
    hexdata=hexdata*16+lowhexdata;
    i++;
    senddata[hexdatalen]=(char)hexdata;
    hexdatalen++;
    }
    senddata.SetSize(hexdatalen);
    return hexdatalen;
    }//这是一个将字符转换为相应的十六进制值的函数
    //好多C语言书上都可以找到
    //功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
    char CSCommTestDlg::ConvertHexChar(char ch) 
    {
    if((ch>='0')&&(ch<='9'))
    return ch-0x30;
    else if((ch>='A')&&(ch<='F'))
    return ch-'A'+10;
    else if((ch>='a')&&(ch<='f'))
    return ch-'a'+10;
    else return (-1);
    }   再将CSCommTestDlg::OnButtonManualsend()修改成以下形式:void CSCommTestDlg::OnButtonManualsend() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(TRUE); //读取编辑框内容
    if(m_ctrlHexSend.GetCheck())
    {
    CByteArray hexdata;
    int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
    m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
    }
    else 
    m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据}
    现在设置好相应串口,然后运行我们这个程序,在发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00 01 02 03 A1 CC了。 
      

  19.   

    9.在接收框中以十六进制显示    这就容易多了:  在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAY Caption: 十六进制显示,再利用ClassWizard为其添加控制变量:m_ctrlHexDiaplay。 然后修改CSCommTestDlg::OnComm()函数:void CSCommTestDlg::OnComm() 
    {
    // TODO: Add your control notification handler code here
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
    CString strtemp;
    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {
    variant_inp=m_ctrlComm.GetInput(); //读缓冲区
    safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
    len=safearray_inp.GetOneDimSize(); //得到有效数据长度
    for(k=0;k<len;k++)
    safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
    for(k=0;k<len;k++) //将数组转换为Cstring型变量
    {
    BYTE bt=*(char*)(rxdata+k); //字符型
    if(m_ctrlHexDisplay.GetCheck())
    strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
    else 
    strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放m_strRXData+=strtemp; //加入接收编辑框对应字符串 
    }
    }
    UpdateData(FALSE); //更新编辑框内容
    }测试:在串口调试助手发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示,在串口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到00 01 02 03 A1 CC了。
      

  20.   

    告诉你一种专业的解决方案
    字符串“abcdef\0"
    的编码是 41 42 43 44 45 46 00 (不知道对应的,你可以查ASCII码表)
    发送到串口字符串"41 42 43 44 45 46 00"
    这样就没有绝对的0出现在你的编码中,同时在通信的时候你对截下的数据分析也很方便,可以直接看到对应的码
    如果你的数据量足够大的话
    有一些串口通信的协议就是用的这种编码