我的数据包的定义
class CPack
{
public:
char m_begin;//包开始
short m_len;//包长
int m_Flash_BeginAddress;//不用管
byte m_data[DATAMAX];//1024
unsigned char m_chk;
char m_end;//包结束
}
CSerialPort port;//用别人的类
port.Open(4, 115200, CSerialPort::NoParity, 8, CSerialPort::OneStopBit, CSerialPort::XonXoffFlowControl);//打开CPack onepack;
CFile fileToRead;
fileToRead.Read(&onepack.m_data[0],DATAMAX);//从文件读数据port.Write(&onepack.m_data[0], DATAMAX);//写到串口//从串口读入
CPack receivingPack;
port.Read(&receivingPack.m_data[0],DATAMAX);
writeAfile.Write(&receivingPack.m_data[0],DATAMAX);//写成文件现在如果是二进制的文件的话生成的文件和读入的有区别,而英文字符的就没问题
代码是列出了重要的,大家帮我分析一下。

解决方案 »

  1.   

    如果是2进制的话,写的文件和读的应该一样
    但在你的代码中看不出你的读/写模式是用2进制的,如果它以字符的方式读/写,那非ascii码的文件肯定会错
      

  2.   

    楼上正解,建议都用 ASCII 传输
      

  3.   

    port.Read(&receivingPack.m_data[0],DATAMAX);
    writeAfile.Write(&receivingPack.m_data[0],DATAMAX);//写成文件
    你用port.Read(&receivingPack.m_data[0],DATAMAX)读数据,
    能保证每次读串口都能读到DATAMAX 字节的数据么?如果不能,你写文件每次都写这么多(DATAMAX)数据当然会出现问题。
      

  4.   

    我用的是CSerailPort类,监控线程每收到一个字符,发送消息给主界面主界面处理。下面给你部分代码,看看能不能帮到你!// 初始化
    if (m_Ports.InitPort(this,mycom,4800))
    {
    m_Ports.StartMonitoring();
    }
    // OnCom事件
        BYTE ppp[5120];//接收缓冲,全局变量
        int n;
        ppp[n]=(BYTE)ch;

    if(ch!=NULL)
    {
    //char buf[10];
    //sprintf(buf,"%02x",(char)ch);
    m_edit_rec+=(char)ch; // m_edit_rec+=buf; //16进制显示
    }// 写文件
    void CMycomDlg::WriteFile(CString wfilename)
    {
    CFile file;
    BYTE  WriteBuf[5120];
    // char ReadBuf[100]; if( !file.Open(wfilename,CFile::modeWrite|CFile::modeCreate))
    {
    ShowMsg("写文件不能打开");
    }
    memset(WriteBuf,0,sizeof(WriteBuf));
    int j=0;
    for(int i=1; i<=n-20; i++)
    {
    WriteBuf[j]=ppp[i];
    j++;
    }
    file.Write(WriteBuf,sizeof(WriteBuf));
    memset(WriteBuf,0,sizeof(WriteBuf));
    file.Close();
    }你看看能不能帮到你
      

  5.   

    CSerialPort 这个类本身不支持二进制的发送与接收,龚建伟把这个类修改了一些,可以用了,目前我也在用这个,建议你去龚建伟的网站上看看