(完整版)VC6.0MFC串口通信编写全过程

合集下载

基于VC6.0MFC的简单串口通信软件编程

基于VC6.0MFC的简单串口通信软件编程

基于VC6.0MFC的简单串⼝通信软件编程(⼀)基于对话框编程基本步骤:1.新建基于对话框的⼯程;2.拖曳所需的基本控件,构成界⾯;3.使⽤类向导(CLASS WIZARD)创建与基本控件对应的成员变量、成员函数,确定与函数相应的消息或事件——即触礁发该函数执⾏的条件(如单击等)。

(⼆)使⽤mscomm控件:1.基本设置:m_com.SetCommPort(1); //选择COM1m_com.SetInBufferSize(1024); //设置输⼊缓冲区的⼤⼩,Bytesm_com.SetOutBufferSize(256); //设置输出缓冲区的⼤⼩,Bytesif(!m_com.GetPortOpen()) //打开串⼝m_com.SetPortOpen(TRUE);m_com.SetInputMode(1); //设置输⼊⽅式为⼆进制⽅式m_com.SetSettings("4800,s,8,1");m_com.SetRThreshold(1); //为1表⽰有⼀个字符引发⼀个事件 m_com.SetInputLen(0);2.似乎每次设置m_com.SetSettings("4800,s,8,1"),必须先关再开串⼝才有效。

设置的校验位似乎只对发送数据有效,对接收数据⽆效。

3.虽然m_com.SetRThreshold(1)设置接收到⼀个字符就引发⼀个事件(触发执⾏函数),但执⾏函数读取到的数据可能不⽌1Byte,如另⼀串⼝连续发送多个字节,当串接收到第⼀个字节后就触发函数,但在函数去输⼊缓冲区读取数据时可以读到8Byte。

(三)MFC的⼀些基本使⽤:1.Unsigned char 与char不同,在执⾏加减时,char型当作带符号数(可能为负)。

2.当控件对应的变量是控件类时,可能通过该类的成员函数来获取数据或执⾏操作:如m_com是mscomm控件的变量,可以执⾏m_com.SetPortOpen(FALSE)来关闭串⼝。

VC上位机MFC利用串口控件发送接收数据程序代码

VC上位机MFC利用串口控件发送接收数据程序代码

VC上位机MFC利用串口控件发送接收数据程序代码打开vc++6.0,建立一个基于对话框的mfc应用程序。

添加控件后会弹出一个确认框
点击“确定”
单击\,控件将被成功添加
然后在控件的属性里进行一些必要的配置:
Inputmode设置为1-binary,这意味着以二进制模式检查数据
其它的用默认值。

您还可以使用oninitdialog()函数中的代码进行设置,如下所示:
设置好以后,要在程序的开始打开串口,不然是没发使用的。

在oninitdialog中加入以下代码:
睡眠(100);方差数据;intdata_len;charcdata[1024];
cdata[data_len]=0;
//CDATA是指向所接收字符串的指针
m_list.addstring(cdata);//在listbox控件中显示接收到的数据}。

VC++6.0实现串口

VC++6.0实现串口
if (!SetCommMask(hCom,EV_RXCHAR | EV_TXEMPTY))
{
MessageBox("掩码设置失败.","提示");
return;
}
DWORD param;
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,&param,0,&dwThreadID);
6.1.4 PC
利用Visual C++ API函数和MSComm控件编写程序实现PC与PC串口通信。
(1)两台计算机互发字符并自动接收,如一台计算机输入字符串“Please returnabc123”,执行“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,执行“发送字符”命令,信息返回到第一组的计算机。实际上就是编写一个简单的双机聊天程序。
{
MessageBox("端口打开失败.");
return;
}
SetupComm(hCom,1024,1024); //设置发送和接收缓冲区大小
//设置串口信息
DCB b;
GetCommState(hCom,&dcb);
dcb.BaudRate = 9600;
dcb.fBinary = True;
rOverLaped.hEvent = CreateEvent(NULL,True,False,NULL);//创建一个事件对象
if (ReadFile(hCom,DataBuffer,rst.cbInQue,&factbyte,&rOverLaped))
//读取数据到缓冲区中

VC6.0MFC串口通信编写全过程

VC6.0MFC串口通信编写全过程

其于MFC的串口调试助手编辑过程一、新建打开VC6.0 文件新建工程MFC AppWiard(exe) 位置(选择保存工程位置)工程名称(输入工程名XXXX)确定选择基本对话框下一步下一步下一步选择(CXXXXDlg)完成确定在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消”及提示框)删除或修改使用,至此基本框架完成如下图:二、往生成的基本框架中添加控件1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下:菜单栏工程添加到工程Components and controls…Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0”Insert 确定OK 关闭此子窗口完成添加操作标志如上图所示。

2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:此控件(标志)是下面步骤添加进来的串口控件基本框架3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示:选择其中任意一个作为输入编辑框及输出编辑框这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。

4、对以上四个控件编程步骤如下:a、右击串口通信控件建立类向导Member variables Control IDS中选择IDC_MSCOMM1 add variable…Member variable name中输入控件变量名m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致)OK 确定b、右击编辑框、属性、常规、ID:中输入ID号,此编辑框用于接收显示数据的其ID 号为IDC_EDIT_RXDATA(可以随意选取,但程序中应与所取ID号一致),再在此窗口的样式中勾选”多行”,同时将“自动水平滚动(T)”勾选去掉,再勾选“垂直滚动(V)”,此勾选操作是用于垂直多行显示的,按回车后即可输入;同理右击另一编辑框输入ID号为IDC_EDIT_TXDATA此编辑框用于编辑发送数据的,同样也选上用于垂直多行显示,发送框可以不用垂直多行显示;再为按钮控件添加ID号,为IDC_BUTTON_MANUALSEND,并将标题中的“Button1”改为“发送”,功能是按一次就把发送编辑框中的内容发送一次。

MFC串口通信编程详解解析

MFC串口通信编程详解解析
在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活.下面只介绍API串口通信部分.
串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式.同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,
}
return TRUE;
二配置串口
在打开通讯设备句柄后,常需要对串口进行一些初始化配置工作.这需要通过一个DCB结构来进行.DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息.在查询或配置串口的属性时,都要用DCB结构来作为缓冲区.
一般用CreateFile打开串口后,可以调用GetCommState函数来获取串口的初始配置.要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState函数设置串口.
//EVENPARITY偶校验NOPARITY无校验
//MARKPARITY标记校验ODDPARITY奇校验
BYTE StopBits;//指定停止位的位数.此成员可以有下列值:
//ONESTOPBIT 1位停止位TWOSTOPBITS 2位停止位
//ONE5STOPBITS 1.5位停止位
………
} DCB;
0,//同步方式
NULL;
if(hCom==(HANDLE-1
{
MessageBox("打开COM失败!";
return FALSE;
}
return TRUE;
重叠I/O打开串口的示例:
HANDLE hCom;//全局变量,串口句柄
hCom =CreateFile("COM1",//串口名称

用MFC实现串口编程

用MFC实现串口编程

用MFC实现串口编程龚建伟评论:本文既写了在Windows中怎样用VC控件MSComm,又说明了API技术编程方法,在写用MSComm控件时,数据类型的转换说得不是太明白,初次涉猎串口编程的朋友恐怕看了还是编不出来;直接从底层编写的部分值得一读,说得较为详细,但你得先从VC教本上看一看什么是线程。

一.串行通信的基本原理二.串口信号线的接法三.16位串口应用程序的简单回顾四.在MFC下的32位串口应用程序㈠使用ActiveX控件?㈡使用32位的API 通信函数本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC实现串口(COM)通信的方法:使用ActiveX控件或Win API.并给出用Visual C++6.0编写的相应MFC32位应用程序。

关键词:串行通信、VC++6.0、ActiveX控件、Win API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。

计算机和单片机(如MCS-51)都具有串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。

实际工作中利用串口完成通信任务的时候非常之多。

已有一些文章介绍串口编程的文章在计算机杂志上发表。

但总的感觉说来不太全面,特别是介绍32位下编程的更少,且很不详细。

笔者在实际工作中积累了较多经验,结合硬件、软件,重点提及比较新的技术,及需要注意的要点作一番探讨。

希望对各位需要编写串口通信程序的朋友有一些帮助。

一.串行通信的基本原理串行端口的本质功能是作为CPU和串行设备间的编码转换器。

当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位。

在接收数据时,串行的位被转换为字节数据。

在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。

应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

MFC串口通信编程详解

MFC串口通信编程详解
COMMTIMEOUTS 结构的定义为: typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;//读间隔超时 DWORD ReadTotalTimeoutMultiplier;//读时间系数 DWORD ReadTotalTimeoutConstant;//读时间常量 DWORD WriteTotalTimeoutMultiplier;//写时间系数 DWORD WriteTotalTimeoutConstant;//写时间常量 } COMMTIMEOUTS,*LPCOMMTIMEOUTS; COMMTIMEOUTS 结构的成员都以毫秒为单位.总超时的计算公式是: 总超时=时间系数×要求读/写的字符数+时间常量 例如要读入 10 个字符,那么读操作的总超时的计算公式为: 读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant 可以看出:间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置 各种超时. 如果所有写超时参数均为 0,那么就不使用写超时.如果 ReadIntervalTimeout 为 0,那么就不使用读间隔超时.如果 ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 都为 0,则不使用读总超时.如果读间隔超时被设置成 MAXDWORD 并且读时间系数和读时间常量都为 0,那么在读一次输入缓冲区的内容后 读操作就立即返回,而不管是否读入了要求的字符. 在用重叠方式读写串口时,虽然 ReadFile 和 WriteFile 在完成操作以前就可能返 回,但超时仍然是起作用的.在这种情况下,超时规定的是操作的完成时间,而不是 ReadFile 和 WriteFile 的返回时间.

在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤

在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤
void CCommTestDlg::OnBnClickedButtonSend() {
// TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
void CCommTestDlg::OnBnClickedButtonOpen() { // TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
10. 添加关闭串口按钮的消息响应函数 void CCommTestDlg::OnBnClickedButtonClose() { // TODO: 在此添加控件通知处理程序代码 m_mscomm.put_PortOpen(FALSE);//关闭串口 AfxMessageBox(_T("串口 1 已关闭")); } 11. 添加发送按钮消息响应函数 void CCommTestDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); //读取编辑框内容 m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据 m_EditSend.Empty(); //发送后清空输入框 UpdateData(false); //更新编辑框内容 } 12. 接收数据 void CCommTestDlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码 static unsigned int cnt=0; VARIANT variant_inp; COleSafeArray safearray_inp; long len,k; unsigned int data[1024]={0}; byte rxdata[1024]; //设置 BYTE 数组 CString strtemp; if(m_mscomm.get_CommEvent()==2) //值为 2 表示接收缓冲区内有字符 {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
确定OK关闭此子窗口完成添加操作标志如上图所示。
2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内
点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:
3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示:
其于MFC的串口调试助手编辑过程
一、新建
二、 打开VC6.0文件新建工程MFC AppWiard(exe)位置(选择保存工程位置)工程名称(输入工程名XXXX)确定选择基本对话框下一步下一步下一步选择(CXXXXDlg)完成确定在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消”及提示框)删除或修改使用,至此基本框架完成如下图:
代码段2:
BOOL CSCommTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
LONG len,k;
BYTE rxdata[2048];//设置BYTE数组AN 8—intterthat is not signed.
CString strtemp;
if (m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有数据
{
////以下你可以根据自己的通信协议加入处理代码
代码段1:
void CScommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;//定义一个VARIANT类对象
COleSafeArray safearray_inp;//定义一个COleSafeArray对象
m_ctrlComm.SetInputLen(0);//设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
return TRUE; // return TRUE unless you set the focus to a control
}
F、发送数据,先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard->Message Maps,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:
}
到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。没错吧?那么做下一步:
E、打开串口和设置串口参数你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。现在我们在主对话框的CSCommTestDlg::OnInitDialog()打开串口,加入如下代码:
逐一对各个组框属性编辑如下:
串口号:
常规ID:IDC_COMBO_CommSelect
数据输入列表框项目(N):COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9(注意每输入一个数据选项以Ctrl+Enter回车后再输入下一个数据选项)
样式将“分类勾选去掉”
进入类向导添加变量,为IDC_COMBO_CommSelect添加一个value类int型变量m_Index,点击OK后,再添加一个Control类CComboBox型变量m_ComboBox点击OK最后“确定”
}
此时运行程序,在发送编辑框中随意输入数,单击发送按钮,若出错则修改后再测试,直到成功再进行以下操作。
5、添加两个“组框”或“静态文本”控件,调整位置及大小,在标师处输入提示文字,这两个控件不用编程,效果如下图:
6、添加5个“静态文本”控件并由属性修改其标题,均不用编程,效果如下图:
7、添加5个“组框”控件,效果如下图:
//m_Date_Select_M.SetCurSel(0);//打开软件时数据位选择框默认显示8
//m_StopBit_M.SetCurSel(0);//打开软件时停止位选择框默认显示1
//m_ParityCheck_M.SetCurSel(0);//打开软件时奇偶校验选择框默认显示无校验N
//下面if语句用于打开默认串口
这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。
4、对以上四个控件编程步骤如下:
a、右击串口通信控件建立类向导Member variables Control IDS中选择IDC_MSCOMM1 add variable…Member ariable name中输入控件变量名m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致)OK确定
//strtemp.Format("%02x ",bt);//将16进制数送入临时变量strtemp存放
//else
strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放
m_strRXData+=strtemp;//加入接收编辑框对应字符串
}
}
UpdateData(FALSE);//更新编辑框内容(主要是接收编辑框中的)
C、为以上两个编辑框添加变量,与串口通信控件一样添加,为IDC_EDIT_RXDATA添加CString型变量m_strRXData;为IDC_EDIT_TXDATA添加CString型变量m_strTXData。说明:m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。
if(!m_ctrlComm.GetPortOpen())
{
m_ctrlComm.SetPortOpen(TRUE);//打开串口
}
else
{
AfxMessageBox("cannot open serial port");
}
/*************************************************************/
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
波特率:
常规ID:IDC_COMBO_BaudRate_Select
数据输入列表框项目(N):9600、14400、19200、38400、56000、57600、115200、128000、256000
样式将“分类勾选去掉”
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
代码段3:
void CSCommTestDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据
variant_inp=m_ctrlComm.GetInput();//读缓冲区
safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();
for(k=0;k<len;k++)
{
SetIcon(m_hIcon, FALSE);// Set small icon
// TODO: Add extra initialization here
//m_ComboBox.SetCurSel(0);//打开软件时串口选择框默认显示COM1
//m_BaudRate_M.SetCurSel(0);//打开软件时波特率选择框默认显示9600
三、往生成的基本框架中添加控件
1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下:
菜单栏工程添加到工程Components and controls…Registered ActiveX Controls选择“Microsoft Communications Control, version 6.0”Insert
相关文档
最新文档