VC串口编程

记性不好,权当记录

// AllocConsole();//打开控制台

// FreeConsole();
// freopen("CONOUT$","w+t",stdout); 
// freopen("CONIN$","r+t",stdin); 
//GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);


//CWnd* pWnd = GetDlgItem(IDC_STATIC);
//CString str;
//pWnd->GetWindowText(str);
//str += localIP;

//pWnd->SetWindowText(str);

//CString port;

//pWnd->GetWindowText(port);

//m_ctrlComm.SetInputModel(atoi(port.GetBuffer(0)));



1、利用ClassWizard定义CMSComm类控制对象
  打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() #i nclude "mscomm.h" //}}AFX_INCLUDES 。


2、在对话框中添加控件
    向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑框的Properties->Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。
  再打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类, 为IDC_EDIT_RXDATA添加CString变量m_strRXData, 为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。


3、添加串口事件消息处理函数OnComm()
  打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,
  这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在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;
        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); 
            strtemp.Format("%c",bt); 
            m_strRXData+=strtemp; //加入接收编辑框对应字符串   
        }  
    }  
    UpdateData(FALSE);   
}  


3、打开串口和设置串口参数


if(m_ctrlComm.GetPortOpen())  
m_ctrlComm.SetPortOpen(FALSE);  
 
m_ctrlComm.SetCommPort(1); //选择com1  
if( !m_ctrlComm.GetPortOpen())  
m_ctrlComm.SetPortOpen(TRUE);//打开串口  
else 
AfxMessageBox("cannot open serial port");  
 
m_ctrlComm.SetSettings("9600,n,8,1");
 
m_ctrlComm.SetInputModel(1); //1:表示以二进制方式检取数据  
m_ctrlComm.SetRThreshold(1);   
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0  
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据  
 


4、发送数据
 
void CSCommTestDlg::OnButtonsend()   
{  
// TODO: Add your control notification handler code here  
  UpdateData(TRUE); //读取编辑框内容  

  m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据  

// CByteArray bytes; //二进制
// bytes.Add( 0x30 );
// m_ctrlComm.SetOutput(COleVariant(bytes));//发送数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CANBus数据链路层协议采用对等式(Peer to peer)通信方式,即使主机出现故障,系统其余部分仍可运行(当然性能受一定影响)。当一个站点状态改变时,它可广播发送信息到所有站点。 CANBus的信息传输通过报文进行,报文帧有4种类型:数据帧、远程帧、出错帧和超载帧,其中数据帧格式如图8所示。CANBus帧的数据场较短,小于8B,数据长度在控制场中给出。短帧发送一方面降低了报文出错率,同时也有利于减少其他站点的发送延迟时间。帧发送的确认由发送站与接收站共同完成,发送站发出的ACK场包含两个“空闲”位(recessive bit),接收站在收到正确的CRC场后,立即发送一个“占有”位(dominant bit),给发送站一个确认的回答。CANBus还提供很强的错误处理能力,可区分位错误、填充错误、CRC错误、形式错误和应答错误等。 CANBus应用一种面向位型的损伤仲裁方法来解决媒体多路访问带来的冲突问题。其仲裁过程是:当总线空闲时,线路表现为“闲置”电平(recessive level),此时任何站均可发送报文。发送站发出的帧起始字段产生一个“占有”电平(dominant level),标志发送开始。所有站以首先开始发送站的帧起始前沿来同步。若有多个站同时发送,那么在发送的仲裁场进行逐位比较。仲裁场包含标识符ID(标准为llbit),对应其优先级。每个站在发送仲裁场时,将发送位与线路电平比较,若相同则发送;若不同则得知优先级低而退出仲裁, 不再发送。系统响应时间与站点数无关,只取决于安排的优先权。可以看出,这种媒体访问控制方式不像Ethetnet的CSMA/CDCA协议那样会造成数据与信道带宽受损。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值