VC++用开发串行通信程序(2)
三. 主程序的编制
首先我们为对话框中的控件添加对应的变量和响应函数。具体做法如表二所示:
控件名称
控件id
对应变量或函数
发送数据编辑框
idc_senddata
m_senddata
接收数据编辑框
idc_receivedata
m_ receivedata
发送按钮
idc_send
onsend()
清除按钮
idc_clear
onclear()
通讯控件
idc_mscomm
m_comm
表2 添加控件表
再打开ClassWizard,选中IDC_MSCOMM,可看到该控件能响应的消息为OnComm,添加改函数并将其改名为OnComm(),在该函数中添加代码,就能实现对串口事件的处理。其中一个需要注意的问题是函数GetInput()返回的是VARIANT型变量,而在编辑框中显示的是 CString型变量,因此必需进行转换。先将VARIANT型变量转换为COleSafeArray型变量,再将其转换为BYTE型数组,然后将数组转换为CString型变量。这个转换过程看起来比较复杂,但它可以满足用不同的变量类型来显示接收数据。该程序的主要代码添加在 CommTestDlg.cpp中,如下所示:
void CCommTestDlg::OnSend()
{
if(!m_Comm.GetPortOpen())
m_Comm.SetPortOpen(TRUE);//打开串口
UpdateData(TRUE);
m_Comm.SetOutput(COleVariant(m_SendData));// 发送数据
}
void CCommTestDlg::OnClear()
{
m_ReceiveData.Empty();//清除接收对话框中的数据
m_SendData.Empty();//清除发送对话框中的数据
UpdateData(FALSE);
}
void CCommTestDlg::OnComm()
{
VARIANT m_Input1;
COleSafeArray m_Input2;
long length,i;
BYTE data[1024];
CString str;
if(m_Comm.GetCommEvent()==2)// 接收缓冲区内有字符
{
m_Input1=m_Comm.GetInput();//读取缓冲区内的数据
m_Input2=m_Input1;//将VARIANT型变量转换为COleSafeArray型变量
length=m_Input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_Input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
for(i=0; i<length;i++)//将数组转换为CString型变量
{
char a=*(char*)(data+i);
str.Format("%c",a);
m_ReceiveData+=str;
}
}
UpdateData(FALSE);// 更新编辑框内容
}
四. 试验程序
现在程序已经写完,可以编译运行。我们可以做一个小实验来验证程序的功能。首先检验你的串口2,看它是否工作正常,可用常见的DOS程序Comdebug 检查。确认串口工作正常后,可用串口线将两台微机的串口2相连,同时在两台机子上运行该程序(也可只用一台微机,将其串口2的2脚和3脚短接,即自发自收状态),在发送对话框中随便敲入一些字符,用鼠标点发送按钮,你就会在另一台机子的接收对话框中看到这些数据,甚至汉字也可以发送。由此可见,利用通讯控件可以很容易的编写出串行通信程序。但相对来说通讯控件在VC中的使用要比在VB中复杂的多,要想开发出更多更灵活的使用方法还需要不断的摸索和实践。
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。