/***************以下是打开串口的代码**********************/
void C串口通信Dlg::OnBnClickedButtonOpen()
{
CString str, str1, n;
GetDlgItemText(IDC_BUTTON_OPEN,str);
CWnd *h1;
h1 = GetDlgItem(IDC_BUTTON_OPEN); if (!m_mscom.GetPortOpen())
{
m_mscom.SetCommPort(m_comb1.GetCurSel() + 1);//选择串口
if (!m_mscom.GetPortOpen())
m_mscom.SetPortOpen(TRUE);//打开串口
else
MessageBox(_T("cannot open serial port"));
m_comb2.GetLBText(m_comb2.GetCurSel(), str1);//获取所选择到的波特率将其放入到str1中
str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1';//这句话很关键
m_mscom.SetSettings(str1);//设置波特率
m_mscom.SetInputMode(1);//设置输入方式1 为二进制输入方式
m_mscom.SetRThreshold(1);//缓冲区》=1个字符触发事件
m_mscom.SetInputLen(0);//设置当前接收缓冲区数据长度为1024
//m_mscom.SetRTSEnable(1);//设置RT允许
if (m_mscom.GetPortOpen())
{
str = "关闭串口";
UpdateData(true);
h1->SetWindowText(str);
}
unsigned char InstStartRs[14] = { 238, 170, 01, 0, 01, 01, 0, 0, 01, 0, 0, 0, 0, 187 };
SendDataToCom(InstStartRs);
m_mscom.GetInput();//先预读缓冲区以清除残留数据
}
else
{
m_mscom.SetPortOpen(false);
if (str != "打开串口")
{
str = "打开串口";
UpdateData(true);
h1->SetWindowText(str);
}
}
}
/*****************发送数据的代码*************************/
void C串口通信Dlg::OnBnClickedButtonSend()//发送数据的按钮
{
// TODO:  在此添加控件通知处理程序代码
UpdateData(true);
m_mscom.SetOutput(COleVariant(m_Editsend));
}/***********************接收到数据触发OnCommMscomm1()事件***********************/
void C串口通信Dlg::OnCommMscomm1()
{
// TODO:  在此处添加消息处理程序代码
VARIANT InputData;
COleSafeArray fs;
BYTE rxdata[1024] = {0};
long len,k;
if (m_mscom.GetCommEvent() == 2)
{
                InputData = m_mscom.GetInput();//读缓冲区
fs = InputData;//VARIANT型变À量转换为COleSafeArray型变量
len = fs.GetOneDimSize();
for (k = 0; k < len; k++)
     fs.GetElement(&k, rxdata + k);//转换为BYTE型数组     
BYTE bt;

for (k = 0; k < len; k++)//将数组转化为CString型变量
{
bt = *(rxdata+k);
OnComByte(bt);
} UpdateData(false);
}
}
void C串口通信Dlg::OnComByte(byte data)
{
if (data == 0xee && End_RData_Flag)
{
HeadFlag = true; // 文件头收到
m_nRxDataLength = 0;
m_strRXDataCOM[0] = data & 0xff;
End_RData_Flag = false;
}
else if (HeadFlag && data == 0xff)
{
Start_Rece_Flag = true;// 可以接收数据了
m_strRXDataCOM[1] = data & 0xff;
m_nRxDataLength = 2;
HeadFlag = false;
}
else if (Start_Rece_Flag && (!HeadFlag))
{
m_strRXDataCOM[m_nRxDataLength] = data & 0xff;
m_nRxDataLength++;
}
if (m_nRxDataLength == 18)
{
End_RData_Flag = true;
m_nRxDataLength = 0;
HeadFlag = false;
Start_Rece_Flag = false;
START_FLAG = true;
}
}
void C串口通信Dlg::SendDataToCom(unsigned char InstSend[14])
{
CByteArray hexdata;
for (int k = 0; k <= 14; k++)
hexdata.Add(InstSend[k]);
hexdata.SetSize(14); m_mscom.SetOutput(COleVariant(hexdata)); //发送十六进制数据
}

解决方案 »

  1.   

    哪位大神使用过MSCOMM串口通信的麻烦给我指导一下!谢谢
      

  2.   

    BYTE rxdata[1024]
    for (k = 0; k < len; k++)
                fs.GetElement(&k, rxdata + k);当 len 大于1024时 有越界问题
      

  3.   

    str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1';//这句作用是什么呢?哪位大神给个回复
      

  4.   

    请问楼主问题解决了吗?遇到一样的问题getinput就退出了消息接收函数
      

  5.   

    InputData = m_mscom.GetInput();//读缓冲区,
    应该是此处发生了com错误,你没有使用try catch,因此错误递交到上级处理,故你其后的代码没有在执行你使用try catch看看能否捕捉到错误
      

  6.   

    表示遇到同样的问题,我接了两个USB转串口,但我的只是针对某个串口,换个串口就可以接收了。但是下载的串口助手两个串口都可以正常接收数据。
      

  7.   


    str1是波特率,n表示没有校验位,8是8个数据位,1表示1个停止位
      

  8.   

    void CTabPage1::readComm2(CByteArray& arr)
    {
    if(h_mscomm1.get_PortOpen()){
    if(h_mscomm1.get_InBufferCount()>0)
    {
    h_mscomm1.put_InputMode(1); //二进制模式输入
    VARIANT var1;
    COleSafeArray arr1;
    var1=h_mscomm1.get_Input();
    arr1=var1;
    DWORD len=arr1.GetOneDimSize();
    long i=0;
    for(;i<len;i++)
    {
    BYTE byte_1;
    arr1.GetElement(&i,&byte_1);
    arr.Add(byte_1);
    }
    h_mscomm1.put_InBufferCount(0); //清空接收缓冲区
    }
    }
    }CString CTabPage1::readComm()
    {
    CString str1=_T("");
    if(h_mscomm1.get_PortOpen()){
    if(h_mscomm1.get_InBufferCount()>0)
    {
    h_mscomm1.put_InputMode(0); //文本模式输入
    VARIANT val=h_mscomm1.get_Input();
    str1=val.bstrVal;
    h_mscomm1.put_InBufferCount(0); //清空接收缓冲区
    }
    }
    return str1;
    }void CTabPage1::writeComm(CByteArray& arr)
    {
    if(h_mscomm1.get_PortOpen()){
    h_mscomm1.put_OutBufferCount(0); //清空发送缓冲区
    h_mscomm1.put_InputMode(1);
    h_mscomm1.put_Output(COleVariant(arr));
    }
    }void CTabPage1::writeComm(CString str)
    {
    if(h_mscomm1.get_PortOpen()){
    h_mscomm1.put_OutBufferCount(0); //清空发送缓冲区
    h_mscomm1.put_Output(COleVariant(str));
    }}