MFC实现对串口通信的编写

合集下载

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。

本文将介绍使用C语言编写51单片机的串口通信程序。

1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。

首先,我们需要一块51单片机开发板,内置了串口通信功能。

另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。

2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。

在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。

同时,我们还需要引入头文件来定义串口通信的相关寄存器。

3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。

这些参数的配置需要根据实际需要进行调整。

在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。

4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。

初始化串口的过程包括打开串口、设置中断等。

5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。

阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。

6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。

在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。

7. 中断处理在串口通信中,中断是一种常见的处理方式。

通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。

8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。

```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。

C#上位机之—WinForm实现串口通信示例

C#上位机之—WinForm实现串口通信示例

C#上位机之—WinForm实现串⼝通信⽰例上位机开发常⽤到串⼝通信来控制设备,串⼝通信的主要参数:COM⼝,波特率(9600),停⽌位(One),数据位(8),校验位(None),括号中的是常⽤值,具体意思我也不太懂,会⽤能实现功能就⾏哈哈;开发⼯具:VS2012; 开发前需要添加以下服务引⽤:.......using System.IO.Ports;窗体搭建,因为没有串⼝设备供调试,所以我⽤虚拟串⼝即两个串⼝互相连接来实现通信,窗体分为上下两部分,对应两个串⼝区,上图为虚拟串⼝设置,下图为Winform样式:⾸先创建⼀个baseCom类:1.声明变量,构造函数:public delegate void delegateOnShowMsg(comType type,string msg);public delegate void delegateOnOpenCom(comType type, bool onOff);public event delegateOnShowMsg OnShow;public event delegateOnOpenCom OnOpen;comType type;string baudRate = string.Empty;string parity = string.Empty;string stopBits = string.Empty;string dataBits = string.Empty;string portName = string.Empty;public System.IO.Ports.SerialPort comPort = new System.IO.Ports.SerialPort();public baseCom(string portName, string baudRate, string stopBits, string dataBits, string parity,comType type){this.portName = portName;this.baudRate = baudRate;this.stopBits = stopBits;this.dataBits = dataBits;this.parity = parity;this.type = type;}View Code2.打开串⼝和关闭串⼝函数:public void OpenPort(){try{if (comPort.IsOpen)comPort.Close();comPort.BaudRate = int.Parse(baudRate);comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), stopBits);comPort.DataBits = int.Parse(dataBits);comPort.Parity = (Parity)Enum.Parse(typeof(Parity), parity);comPort.PortName = portName;comPort.Handshake = Handshake.None;comPort.Open();if (comPort.IsOpen){showOnoff(true);comPort.Handshake = Handshake.None;comPort.DataReceived += comPort_DataReceived;}showMsg(portName + " Open Success");}catch (Exception ex){showMsg("Unable to Open " + portName);showMsg(ex.Message);showOnoff(false);}}public void ClosePort(){if (comPort.IsOpen){comPort.Close();comPort.Dispose();showOnoff(false);showMsg(portName + " Close Success");}}View Code3.接受数据和发送数据函数:public void comPort_DataReceived(object sender,SerialDataReceivedEventArgs e) {try{int n = comPort.BytesToRead;if (n == 0)return;byte[] buffer = new byte[n];comPort.Read(buffer, 0, n);string rcv = Encoding.Default.GetString(buffer, 0, buffer.Length);showMsg("RECV:" + rcv);}catch (Exception ex){ClosePort();showMsg("Com Closed:" + ex.Message);}}public void comPort_SendData(string msg){if (msg == ""){showMsg("CAN Not EMPTY");return;}if (comPort == null){showMsg("First Open Port");return;}if (!comPort.IsOpen){showMsg("COM Not Open");return;}byte[] data = Encoding.Default.GetBytes(msg);comPort.Write(data, 0, data.Length);showMsg("SEND:" + msg);}View Code4.显⽰信息,显⽰状态函数:public void showMsg(string msg){if (OnShow != null)OnShow(type, msg);}public void showOnoff(bool flag){if (OnOpen != null)OnOpen(type, flag);}public enum comType{_up,_down}View CodeOK,baseCOM类已定义完成,现在编写窗体各控件的功能函数:1.初始化控件,主要是下拉菜单的Item的添加,初始值,初始状态:public string[] baudRates = { "2400", "4800", "9600", "19200", "39400", "43000", "56000" };public string[] paritys = { "None", "ODD", "Even" };public string[] dataBits = { "5", "6", "7", "8" };public string[] stopBits = { "None", "One", "Two", "OnePointFive" } ;public void InitControls(){comboBox_com.Items.Clear();comboBox_baudRate.Items.Clear();comboBox_dataBits.Items.Clear();comboBox_parity.Items.Clear();comboBox_StopBit.Items.Clear();comboBox_com2.Items.Clear();foreach (var v in baudRates)comboBox_baudRate.Items.Add(v);foreach (var v in stopBits)comboBox_StopBit.Items.Add(v);foreach (var v in paritys)comboBox_parity.Items.Add(v);foreach (var v in dataBits)comboBox_dataBits.Items.Add(v);foreach (var v in System.IO.Ports.SerialPort.GetPortNames()){comboBox_com.Items.Add(v);comboBox_com2.Items.Add(v);}comboBox_com.SelectedIndex = 0;comboBox_baudRate.SelectedIndex = 2;comboBox_dataBits.SelectedIndex = 3;comboBox_parity.SelectedIndex = 0;comboBox_StopBit.SelectedIndex = 1;comboBox_com2.SelectedIndex = 0;}View Code2.声明两个COM类,comUp和comDown:public delegate void delegateOnOff(comType type,bool onoff);//定义两个委托public delegate void delegateShow(comType type,string msg);//为了防⽌报错“从不是创建控件的线程控制它”baseCom comUp; // 定义上串⼝COMbaseCom comDown; //定义下串⼝COMImage imgOn, imgOff; //指⽰灯Thread th; //线程⽤来实现⾃动发送3.编写打开(关闭)串⼝按钮点击事件(打开comUp和打开comDown代码⼀样,只贴出comUp):private void button_OpenCom_Click(object sender, EventArgs e){string cmd = ((Button)sender).Text.Split('')[0];if (comUp != null)comUp.ClosePort();if (cmd == "Close")return;string s1 = comboBox_com.SelectedItem.ToString();string s2 = comboBox_baudRate.SelectedItem.ToString();string s3 = comboBox_StopBit.SelectedItem.ToString();string s4 = comboBox_dataBits.SelectedItem.ToString();string s5 = comboBox_parity.SelectedItem.ToString();comUp = new baseCom(s1, s2, s3, s4, s5,comType._up);comUp.OnOpen += SignalState;comUp.OnShow += ShowMsg;comUp.OpenPort();}View Code4.编写发送数据按钮点击事件:private void button_Send_Click(object sender, EventArgs e){if (comUp != null) Port_SendData(textBox_ComSend.Text);}5.编写数据接受发送显⽰到⽂本框及状态指⽰灯变化函数:public void SignalState(comType type,bool onoff){if (this.InvokeRequired){delegateOnOff d = new delegateOnOff(SignalState);this.Invoke(d,new object[]{type,onoff});}else{if (type == comType._up){pictureBox_ComSignal.Image = onoff ? imgOn : imgOff;button_OpenCom.Text = onoff ? "Close COM" : "Open COM";}else{pictureBox_Com2.Image = onoff ? imgOn : imgOff;button_OpenCom2.Text = onoff ? "Close COM" : "Open COM";}}}public void ShowMsg(comType type, string msg){if (this.InvokeRequired){delegateShow d = new delegateShow(ShowMsg);this.Invoke(d, new object[] { type, msg });}else{string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "\r\n";if (type == comType._up){textBox_serialPort.Text += (date + msg + "\r\n");}else{textBox_serialPort2.Text += (date + msg + "\r\n");}}}View Code6.Monitor函数,即线程函数,⽤来实现数据⾃动发送(没有进⾏准确定时,⼤概设了个间隔):public void Monitor(){double i =0;while (i++<10000000000){if (i == 1000000000){i = 0;if (checkBox_AutoSend.Checked){if (comUp != null)Port_SendData(textBox_ComSend.Text);}if (checkBox_AutoSend2.Checked){if (comDown != null)Port_SendData(textBox_comSend2.Text);}}}}View Code⾄此,串⼝通信功能已基本实现,可在此框架上进⾏实际应⽤开发,编码新⼿,欢迎⼤家批评指正!看下效果图(COM1和COM11虚拟连接):。

C语言串口通信-源代码

C语言串口通信-源代码

C语言串口通信-源代码#include<tdio.h>#include<do.h>#include<conio.h>#include<tring.h>#defineCOM2320某2f8#defineCOMINT0某0b#defineMa某BufLen500#definePort82590某20#defineEofInt0某20taticcharintvectnum;taticunignedcharmakb;taticunignedcharBuffer[Ma某BufLen];taticintCharInBuf,CircIn,CircOut;taticvoid(interruptfar某OldAyncInt)();taticvoidinterruptfarAyncInt(void);unignedcharData,unignedcharStop,unignedcharParity){ unignedcharHigh,Low;intf;intvectnum=IntVectNum;CharInBuf=0;CircIn=0;CircOut=0;diable();OldAyncInt=getvect(IntVectNum);etvect(IntVectNum,Ay ncInt);enable();makb=inp(Port8259+1);if(IntVectNum==0某0c)outp(Port8259+1,makb&0某ef);eleoutp(Port8259+1,makb&0某f7);}taticvoidinterruptfarAyncInt(void){diable();if(CharInBuf<Ma某BufLen)if(CircIn<Ma某BufLen-1)CircIn++;eleCircIn=0;if(CircIn==CircOut)CircOut++;eleCharInBuf++;enable();outp(Port8259,EofInt);}voidRetore(void)etvect(intvectnum,OldAyncInt);outp(Port8259+1,makb);}intGetCharInBuf(unignedchar某Char) {intFlag;Flag=-1;if(CharInBuf>0){(某Char)=Buffer[CircOut];if(CircOut<Ma某BufLen-1)CircOut++; eleCircOut=0;CharInBuf--;Flag=0;}returnFlag;}intSendChar(unignedcharChar)return0;}main(){inti,c;unignedcharInChar;Init_COM(COM232,COMINT,1200,8,1,0); while(1){if(kbhit()){if((InChar=getch())==27)break; elewhile(SendChar(InChar));}if(GetCharInBuf(&InChar)==0)printf("%c",InChar);}Retore();}接收程序:#include<do.h>#include<ftream.h>#include<conio.h>#include<tdio.h>#include<tdlib.h>#include<math.h>#defineR某D0//接收voidInt(){unignedcharkey,key2;if(peek(0某40,port某2)==0){e某it(1);}ele{};Getportaddr(port);//得到串口地址SerInit(SER_BAUD_9600,SER_PARITY_EVEN|SER_BITS_8|SER_STOP_1) ;//初始化串口,设置波特率等SerOpen();do{if(kbhit()){key2=getch();if(key2==27){break;}};key=getb();if(key!=0某ff){printf("%某\t",key);FILE某fp;fp=fopen("C:\\Receivedata.dat","ab");//可选择接收数据的存放文件路径和文件名if(fp==NULL)printf("Fileopenerror!");//fputc(key,fp);fwrite(&key,izeof(unignedchar),1,fp);fcloe(fp);}}while(key2!=27);SerCloe();//printf("%dcharhabeenreceived\n",incount); //printf("%dcharhabeenended\n",outcount);//printf("\num=%d\n",um);}{printf("PleaeinputthereceiveCOMnum:(1~4)\n"); Cloe_Serial(intport_bae){outp(port_bae+SER_MCR,0);outp(port_bae+SER_IER,0);outp(PIC_IMR,old_int_mak);if(port_bae==COM_1){_do_etvect(INT_SER_PORT_0,Old_Ir);}ele{_do_etvect(INT_SER_PORT_1,Old_Ir);}}/某-------------发送应用----------------某/ voidmain(intargc,char某argv[]){charch,pre;intdone=0;FILE某fp;argc=2;if(argc<2){printf("\nUage:diplayfilename.wav!!!");//e某it(1);}if((fp=fopen(argv[1],"r+b"))==NULL){printf("cannotopenthefile\n");//e某it(0);}feek(fp,0,SEEK_SET);Open_Serial(COM_1,SER_BAUD_9600,SER_PARITY_EVEN|SER_STOP_1);printf("preanykeytobeginending");getch();//Serial_Write('');//该语句可用于发送单个字符while(!done&&ch!=EOF)//发送文件开始{ch=fgetc(fp);SER_BITS_8|//if(ch==EOF)Serial_Write(27);Serial_Write(ch);delay(30);if( kbhit()){pre=getch();if(pre==27){Serial_Write(27);done=1;}}}Cloe _Serial(COM_1);fcloe(fp);}下面介绍最重要的MFC:CWnd:窗口,它是大多数“看得见的东西”的父类(Window里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。

VS2021之MFC串口通信的编写教程

VS2021之MFC串口通信的编写教程

VS2021之MFC串口通信教程说明:本人也是方才入门MFC,参照一些资料和源代码就实验做了这么一个串口通信工具!资料来源要紧有鸡啄米博客网站,里面有详细的学习教程!网上的VS2021源代码都比较少,建议大伙儿先明白得一个源代码的构架和结构再深切学习!本文档能够一步一步教你从成立工程到实验调试,是一个超级完整的教程!超级适合新手练习!——贺州学院大学生创新基地实验室在制作串口通信所碰着的问题:编辑框的转动条可不能随着数据的更新维持在最后一行!接下来咱们开始讲解MFC串口通信的制作:一、打开VS2021软件,然后新建一个项目,如以下图所示;咱们要用到确实是对话框模块,因此选择如以下图所示最大化框最好别选,因为本人此刻也没弄出来;点击完成绩新建好一个工程了,等资源就绪以后咱们就可以够够进行制作了;咱们能够看到就绪以后的界面如以下图所示,依照步骤把原先的静态文本框和确信按钮、取消按钮删掉;二、为咱们的对话框添加控件添加两个组合边框,并放置好位置;修改组合边框显示的名称;在组合边框里面添加编辑文本框;在这一步必然要警戒选择右边的属性;这一步是把串口控件添加到对话框中来;选择咱们需要的串口控件如以下图所示;三、为编辑框,Combox框,串口控件添加变量;四、为按钮和串口控件添加程序函数void C串口V2Dlg::OnBnClickedButtonOpen()//打开串口按钮程序{// TODO: 在此添加控件通知处置程序代码?CString str,str1,n; //概念字符串GetDlgItemText(IDC_BUTTON_OPEN,str);CWnd *h1;h1=GetDlgItem(IDC_BUTTON_OPEN); //指向控件的captionif(!m_mscom.get_PortOpen()){m_comb2.GetLBText(m_comb2.GetCurSel(),str1);//取得所选的字符串,并寄放在str1里面str1=str1+','+'n'+','+'8'+','+'1'; //这句话很关键m_mscom.put_CommPort((m_comb1.GetCurSel()+1)); //选择串口m_mscom.put_InputMode(1); //设置输入方式为二进制方式m_mscom.put_Settings(str1); //波特率为(波特率组Á合框)无校验,8数据位,1个停止位m_mscom.put_InputLen(1024); //设置当前接收区数据长度为1024m_mscom.put_RThreshold(1); //缓冲区一个字符引发事件m_mscom.put_RTSEnable(1); //设置RT许诺m_mscom.put_PortOpen(true); //打开串口if(m_mscom.get_PortOpen()){str=_T("关闭串口");UpdateData(true);h1->SetWindowText(str); //改变按钮名称为‘’关闭串口”}}else{m_mscom.put_PortOpen(false);if(str!=_T("打开串口)){str=_T("打开串口");UpdateData(true);h1->SetWindowText(str); //改变按钮名称为打开串口}}}void C串口V2Dlg::OnBnClickedButtonSend()//发送数据按钮程{// TODO: 在此添加控件通知处置程序代码?UpdateData(true); //更新控件数据m_mscom.put_Output(COleVariant(m_Editsend));//把发送编辑框的数据发送出去}void C串口V2Dlg::OnBnClickedButtonClean()//清除数据按钮程序{// TODO: 在此添加控件通知处置程序代码m_EditReceive=_T(""); //给接收编辑框发送空格符UpdateData(false); //更新数据}void C串口V2Dlg::OnBnClickedButtonClose()//退出按钮程序{// TODO: 在此添加控件通知处置程序代码if(m_mscom.get_PortOpen())m_mscom.put_PortOpen(false);CDialogEx::OnCancel();}void C串口V2Dlg::OnCommMscomm1()//串口控件程序{// TODO: 在此处添加消息处置程序代码if(m_mscom.get_CommEvent()==2){char str[1024]={0};long k;VARIANT InputData=m_mscom.get_Input(); //读缓冲区COleSafeArray fs;fs=InputData; //VARIANT型变À量转换为COleSafeArray型变量for(k=0;k<fs.GetOneDimSize();k++)fs.GetElement(&k,str+k); //转换为BYTE型数组m_EditReceive+=str; // 接收到编辑框里面//SetTimer(1,10,NULL); //延时10msUpdateData(false);}}// 串口选择组合框CString str;int i;for(i=0;i<15;i++){str.Format(_T("com %d"),i+1);m_comb1.InsertString(i,str); }m_comb1.SetCurSel(0);//预置COM口//波特率选择组合框CString str1[]={_T("300"),_T("600"),_T("1200"),_T("2400"),_T("4800"),_T("9600"), _T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200")};for(int i=0;i<12;i++){int judge_tf=m_comb2.AddString(str1[i]);if((judge_tf==CB_ERR)||(judge_tf==CB_ERRSPACE))MessageBox(_T("build baud error!"));}m_comb2.SetCurSel(5);//预置波特率为"9600"写完以后编译程序五、调试咱们写好的串口工具咱们下面用51单片机调试一下,结果也是成功的;m_Edit.SetSel(-1, -1);this->SetDlgItemTextW(IDC_EDIT1,m_EditReceive);//将m_EditReceive内容显示到ID为IDC_EDIT1的编辑框的最后位置m_Edit.LineScroll(m_Edit.GetLineCount()-1,0);//将垂直转动条转动到最后一修改一下接收编辑框的属性,发送编辑框不用做修改;再调试一下觉察问题解决了!六、修改图标和软件信息咱们去到项目所在的文件夹中,如以下图所示;The End!刘小二2021年5月2日礼拜五。

VC++MFC基础教程

VC++MFC基础教程
DCB dcb; GetCommState(hCom,&dcb); dcb.BaudRate=9600; //波特率为 dcb.ByteSize=8; //每个字节有位
dcb.Parity=NOPARITY; //无奇偶校验位 dcb.StopBits=TWOSTOPBITS; //两个停止位 SetCommState(hCom,&dcb);
m_cComm.put_OutBufferSize(512); //设置输出缓冲区 m_cComm.put_Settings(TEXT("9600,n,8,1"));//波特率,无校验,个数
据位,个停止位
if(!m_cComm.get_PortOpen())
{
m_cComm.put_PortOpen(TRUE); //打开串口
B)修改控件属性
修改上面的示例编辑框属性: ID——IDC_EDIT_RECV;
Multiline——True; Want Return——True; Vertical Scroll——True; Auto VScroll——True;
修改下面的示例编辑框属性: ID——IDC_EDIT_SEND; Multiline——True; Vertical Scroll——True;
1.3、API 串口编程
按照步骤一新建 Serial 工程,这里不赘述了。
A)添加 API 串口初始化代码
1、在 SerialDlg.cpp 文件中添加全局变量:
HANDLE hCom; //全局变量,串口句柄 // CSerialDlg 对话框
2、在 SerialDlg.cpp 文件中的 OnInitDialog()函数添加如下代码:
AfxMessageBox("写串口失败!"); }

mfc串口类使用方法

mfc串口类使用方法

mfc串口类使用方法MFC串口类使用方法一、引言MFC(Microsoft Foundation Classes)是微软公司为Windows操作系统开发的一套C++类库,提供了一系列的类和函数,简化了Windows程序的开发。

MFC串口类是其中的一个重要组成部分,用于实现在Windows平台下对串口进行读写操作。

本文将介绍MFC串口类的使用方法,帮助读者快速上手并实现串口通信功能。

二、MFC串口类的基本介绍MFC提供了一个名为CSerialPort的串口类,通过该类可以方便地进行串口的打开、关闭、读写等操作。

在使用MFC串口类之前,需要在代码中包含相应的头文件:#include "afxwin.h"三、打开串口在使用串口之前,首先需要打开串口。

打开串口的函数原型如下:BOOL CSerialPort::Open(int nPort, int nBaud, char nParity, int nDatabits, int nStopbits, DWORD dwCommEvents, UINT nBufferSize = 512);参数说明:nPort:串口号,例如1代表COM1;nBaud:波特率,例如9600;nParity:奇偶校验位,可以选择'N'(无校验)、'E'(偶校验)或'O'(奇校验);nDatabits:数据位,可以选择5、6、7或8;nStopbits:停止位,可以选择1或2;dwCommEvents:串口事件,可以选择EV_RXCHAR(接收到字符时触发)或EV_RXFLAG(接收到指定标志位时触发);nBufferSize:缓冲区大小,默认为512。

示例代码如下:CSerialPort serial;if (serial.Open(1, 9600, 'N', 8, 1, EV_RXCHAR)){// 串口打开成功}else{// 串口打开失败}四、关闭串口在使用完串口后,需要关闭串口。

MFC串口通信程序(基于Vc++及Serialport类)

MFC串口通信程序(基于Vc++及Serialport类)

编程步骤
编写按钮控件消息响应处理函数-发送
以同样的方法打开“发送”按钮的消息函数,插入下面语句
void C串口通信程序Dlg::OnBnClickedButton3() { if(!m_bPortOpen) //检测串口是否打开 return ; //如果关闭,则结束函数 else //如果打开,则执行下面语句 UpdateData(TRUE); //读入编辑框的数据(把编辑框中的字符写入变量) m_SerialPort.WriteToPort((LPCTSTR)m_strTxMsg); //调用函数发送数据 }
m_strPairty
Control型变量
m_strTxMsg
m_strRxMsg
Value型变量
编程步骤
对写好的对话框进行一个初始化 在初始化函数OnInitDialog()中添加如下语句:
BOOL C串口通信程序Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); m_ctrlComPort.SetCurSel(0);//设置默认的索引值 m_ctrlBaudRate.SetCurSel(0); m_ctrlPairty.SetCurSel(0); m_ctrlDataBits.SetCurSel(3); m_ctrlStopBits.SetCurSel(0); GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); //把窗口中的“打开串口”置为活动的可操作状态 GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); //把窗口中的“关闭串口”置为灰色的不可操作状态
编程步骤
• • 在对话框c文件中声明串口类对象 定义一个布尔变量 CSerialPort m_SerialPort BOOL m_bPortOpen //用来表示标志串口是否打开

VS2012+MFC+串口通信的实现

VS2012+MFC+串口通信的实现

VS2012+MFC+串口通信的实现我的电脑是win7 64位的。

文档中的图片可通过按住ctrl键加鼠标滚轮进行放大缩小VS2012链接:/s/1hsGOyji密码:mb0l然后需要下载串口控件:链接:/s/1i57YRHj密码:1s91压缩包包含四个文件:MSCOMM.SRG、MSCOMM32.DEP、MSCOMM32.oca、mscomm32.ocx;解压后拷贝到:C:\Windows\System32(WIN7、Win8、Win10系统);C:\WINDOWS\system32(XP系统)。

注意:64位win7、8、10系统还需要将mscomm32.ocx文件复制到C:\Windows\SysWOW64\目录下,否则后面注册会出错。

在C:\Windows\System32里找到cmd.exe以管理员身份运行:Regsvr32 C:\WINDOWS\system32\MSCOMM32.OCX注册成功如图所示:然后修改注册表:win+R组合键打开“运行”或者直接在开始菜单里找到“运行”;输入regedit后回车,打开注册表管理器,在其中找到HKEY_CLASSES_ROOT项下的Licenses项,添加主项命名为“4250E830-6AC2-11cf-8ADB-00AA00C00905”,并将键值修改为“kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”这样计算机的配置就算完成了。

下面开始创建工程。

打开VS2012->文件->新建->项目新建MFC应用程序,然后修改项目名称,最好是全部英文字母,下面的解决方案名称会自动修改,然后确定就行了。

出现的是这个页面,点击下一步。

修改应用程序类型为基于对话框、MFC的使用改为在静态库中使用MFC、去掉使用Unicode库。

点击下一步。

把最小化框和最大化框勾上,点击下一步。

不用修改点击下一步。

点击完成即可创立完成。

C++串口通信实例(vs2008)

C++串口通信实例(vs2008)

VS2008下用MFC 的MSComm控件编写串口程序首先启动VS2008,文件——新建——项目(快捷键Ctrl+Shift+N),项目类型——Visual C++——MFC——模板——MFC应用程序,●名称(如port1)。

●位置(如桌面下的文件夹‘配置软件’)。

●解决方案名称(会随着名称自动生成,建议不要修改)点击确定,进入MFC应用程序向导。

选择下一步,不要直接点完成。

选择——基于对话框,把使用Unicode库(N)点掉。

然后下一步,把“关于”框(B)点掉,可以点完成了。

进入界面把对话框窗口中的静态文本控件,两个按钮控件都删掉,(选中后按Delete键即可),修改后的界面如下图。

在对话框中添加两个组框(Group Box),组框中分别添加一个文本编辑控件(Edit Control),另外加入一个按钮控件(Button)这些都在工具箱中,选中后在对话框窗口中调节控件大小。

1.需要修改所添加的控件一些属性,如鼠标左键选中上面的组框,单击鼠标右键选属性——Caption——改为:显示区。

2.修改下面的组框:属性——Caption——发送区。

3.修改上面的示例编辑框属性:●ID——IDC_EDIT_RECV;●Multiline——True;●Want Return——True;●Vertical Scroll——True;●Auto VScroll——True;4.修改下面的示例编辑框属性:●ID——IDC_EDIT_SEND;●Multiline——True;●Vertical Scroll——True;5.修改按钮控件的属性:●ID——IDC_BUTTON_SEND;●Caption——发送修改好属性后的窗口如下图:接下来添加关键的控件,选择工具——选择工具箱项——COM组件——Microsoft Communications Control,version 6.0——确定,这时在工具箱下就有了该控件,小电话标志。

在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 表示接收缓冲区内有字符 {

【最新资料】MFC实现对串口通信的编写

【最新资料】MFC实现对串口通信的编写

在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。

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

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

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

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

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

希望对各位需要编写串口通信程序的朋友有一些帮助一.串行通信的基本原理串行端口的本质功能是作为CPU和串行设备间的编码转换器。

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

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

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

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

串口通信程序的流程如下图:二.串口信号线的接法一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。

25芯和9芯的主要信号线相同。

以下的介绍是以25芯的RS-232C为例。

①主要信号线定义:2脚:发送数据TXD; 3脚:接收数据RXD; 4脚:请求发送RTS; 5脚:清除发送CTS;6脚:数据设备就绪DSR;20脚:数据终端就绪DTR;8脚:数据载波检测DCD;1脚:保护地; 7脚:信号地。

②电气特性:数据传输速率最大可到20K bps,最大距离仅15m.注:看了微软的MSDN 6.0,其Windows API中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到RS_256000,即256K bps! 也不知道到底是什么串行通讯设备?但不管怎样,一般主机和单片机的串口通讯大多都在9600 bps,可以满足通讯需求。

VS2010MFC 入门编程七(基于MSCOMM32.OCX控件的串口编程)

VS2010MFC 入门编程七(基于MSCOMM32.OCX控件的串口编程)

VS2010MFC 入门编程七(基于MSCOMM32.OCX控件的串口编程)值得注意的是第一种方法的发送方式是发送不了0X00的,第二种方法中解决啦0x 00不能发送的问题;建立基于对话框的MFC工程,命名为“CommTest”,应用程序选择”基于对话框“建立好工程如下图所示:删除默认的按钮以及静态文本框,添加如下对话框控件:A:打开串口控件,工具栏中拖一个botton 到diadlg 上,并修改Caption 为”打开串口“,修改ID 为IDC_BOTTON_OPENB:关闭串口控件,工具栏中拖一个botton 到diadlg 上,并修改Caption 为”关闭串口“,修改ID 为IDC_BOTTON_CLOSEC:发送控件,工具栏中拖一个botton 到diadlg 上,并修改Caption 为”发送“,修改ID 为IDC_BOTTON_SENDD:发送编辑框和接受编辑框添加通信串口控件,在对话框上右键在对话框右下角电话样子的就是串口通信控件给控件添加变量在电话图标上右击:命名如图示,点击完成在工程中会自动生成mscomm.h 和mscomm.cpp两个文件;给两个编辑框添加成员变量添加三个按钮的事件直接双击三个按钮会在程序中自动添加如下函数[cpp] view plaincopyprint?voidCCommTestDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码}[cpp] view plaincopyprint?voidCCommTestDlg::OnBnClickedButtonOpen() { // TODO: 在此添加控件通知处理程序代码}[cpp] view plaincopyprint?voidCCommTestDlg::OnBnClickedButtonClose() { // TODO: 在此添加控件通知处理程序代码}添加控件事件处理函数:点击添加编辑即可,在CommTestDlg.cpp中会生成函数:[cpp] view plaincopyprint?voidCCommTestDlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码}数据接收都是从这个函数处理打开串口函数实现:[cpp] view plaincopyprint?voidCCommTestDlg::OnBnClickedButtonOpen() { // TODO: 在此添加控件通知处理程序代码if(m_mscomm.get_PortOpen()){ m_mscomm.put_PortOpen(FALSE);} m_mscomm.put_CommPort(3); //选择COM3m_mscomm.put_InBufferSize(1024); //接收缓冲区m_mscomm.put_OutBufferSize(1024);//发送缓冲区m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取m_mscomm.put_InputMode(1);//以二进制方式读写数据m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnCommm_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,1个停止位if(!m_mscomm.get_PortOpen())//如果串口没有打开则打开{ m_mscomm.put_PortOpen(TRUE);//打开串口AfxMessageBox(_T("串口3打开成功")); } else{ m_mscomm.put_OutBufferCount(0); AfxMessageBox(_T("串口3打开失败")); } } 关闭按钮实现:[cpp] view plaincopyprint?voidCCommTestDlg::OnBnClickedButtonClose() { // TODO: 在此添加控件通知处理程序代码m_mscomm.put_PortOpen(FALSE);//关闭串口AfxMessageBox(_T("串口 3 已关闭")); } 发送代码实现:[cpp] view plaincopyprint?voidCCommTestDlg::OnBnClickedButtonSend() { //TODO: 在此添加控件通知处理程序代码UpdateData(true); //读取编辑框内容m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据m_EditSend.Empty(); //发送后清空输入框UpdateData(false); //更新编辑框内容} 接受数据实现:[cpp] view plaincopyprint?voidCCommTestDlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码static unsigned int cnt=0; VARIANT variant_inp; COleSafeArray safearray_inp; long len,k; unsigned intdata[1024]={0}; byte rxdata[1024]; //设置BYTE 数组CString strtemp;if(m_mscomm.get_CommEvent()==2) //值为2 表示接收缓冲区内有字符{ cnt++;variant_inp=m_mscomm.get_Input(); //读缓冲区消息safearray_inp=variant_inp; ///变量转换len=safearray_inp.GetOneDimSize(); //得到有效的数据长度for(k=0;k&lt;len;k++){ safearray_inp.GetElement(&amp;k,rxdata +k); } for(k=0;k&lt;len;k++) //将数组转换为CString 型变量{ strtemp.Format(_T("%c"),*(rxdata+k));m_EditReceive+=strtemp; CStringtemp=_T("\r\n"); //换行m_EditReceive+=temp; } }UpdateData(FALSE); //更新编辑框内容} //接收到的数据存放在//byte 型数组rxdata[1024]中,再进行进一步处理,此处只是//以16 进制显示出来//说明(自己的理解):上面是基于事件驱动型的串口通信方式,感觉事件驱动与中断类似,但//绝对不是中断,每一次响应事件的时候接收缓冲区的数据的长度不是固定的。

用MFC的MSComm控件编写串口通信助手1.0beta

用MFC的MSComm控件编写串口通信助手1.0beta
m_cComm.SetPortOpen(FALSE);
m_cComm.SetCommPort(1); //选择COM1端口 m_cComm.SetInputMode(1); //输入方式为二进制方式 m_cComm.SetInBufferSize(1024); //设置输入缓冲区 m_cComm.SetOutBufferSize(512); //设置输出缓冲区 m_cComm.SetSettings("9600,n,8,1");//波特率9600,无校验,8个数据位,1个停止位 if(!m_cComm.GetPortOpen()) {
xinzrjay 原创,转载需注明,欢迎分享学习。 xinzrjay@
QQ:1472956011
用 MFC 的 MSComm 控件编写串口通信助手 1.0beta
首先说明: 1.本教程是作者辛苦学习之后写出来的,学之前都觉得很难,MFC 忘了好几年了,串口通信也不是很 懂。但是现在觉得很简单了,因为用 MFC 编写东西,很多时候并不需要具体了解底层,知道一些类,函 数就可以了。网站这样的教程一大堆,很多牛人 N 年前都已经玩熟了。 2.本人主要借鉴的是 龚建伟的《Visual C++/Turbo C 串口通信编程实践》这本书,真的很不错,大 家可以去借来看看,基本可以无视我的东西了。之所以写这个是因为网上好多都太省略了,而且界面什么 的都不是我想要的。 3.由于是 1.0 的版本,功能很弱,写的也尽可能的详细,以后有时间会写后续版本,当然不会这样详 细了。 4...............................
variant_inp=m_cComm.GetInput(); //读缓冲区消息
9
xinzrjay 原创,转载需注明,欢迎分享学习。 xinzrjay@

用VS2008打造上位机串口通信软件

用VS2008打造上位机串口通信软件

QQ:1875358679
最后点击确定键,就成功添加 MS 串口通讯控件了,工具箱中就会出现串口控件图标了
然后我们回到对话框编辑界面,添加控件并调整对话框大小,最终如图所示
然后我们修改各控件的属性,得到如下效果
VS2008 串口简单例程
制造者:bbsview
QQ:1875358679
基本界面到此算是完工了,下面将进入代码阶段,没有基础的同学可能看起来会比较吃力, 建议多看几遍,一步一来。 首先为 MS 串口控件添加一个变量,在对话框编辑窗口中,鼠标右键点击 MS 串口控件。如下 图所示
VS2008 串口简单例程
制造者:bbsview
QQ:1875358679
VS2008 上位机串口通信简单例程
首先,在 vs2008 环境下创建 MFC 运用程序
设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步 出现如下界面:
VS2008 串口简单例程
制造者:bbsview
//计算成实际温度值
m_ReceiveData += stremp1;
m_ReceiveData += " °C\r\n";//字符串加单位°C后换行
}
}
}
SetDlgItemText(IDC_EDIT1,m_ReceiveData);//更新文本控件的显示
添加完后我们编译一下看看有什么错误,有的话就找出错误并修改它。
// TODO: 在此添加控件通知处理程序代码 if(! m_Com.get_PortOpen())//判断串口是否已经打开 { m_Com.put_PortOpen(TRUE); //如果串口是关闭的,则打开

Visual C++与串口通信

Visual C++与串口通信

V i s u a l C++与串口通信利用Visual C++编制串行通信程序有3种方法:一是采用Win32应用程序编程接口(API)所提供的串行通信函数,用SDK思路编写;二是用ActiveX通信控件MSComm开发串行通信程序;三是采用C++的MFC思路,将Win32串口通信的API函数封装在一个类中实现串行通信。

在实践中,使用Visual C++串口控件MSComm实现通信的方法比调用API动态链接库的方法更加方便、快捷,而且用较少的代码可以实现相同的功能,从而大大提高了编程效率,也减少了因编程不当而导致的系统不稳定。

采用C++的MFC思路的方法较为繁琐,不仅要了解Win32串行通信的API函数,还要掌握多线程编程,但控制灵活,既涉及到底层编程、纠错能力强,又有C++风格,一般多为专业C++开发人员所采用。

5.1 串行接口串行接口一般包括RS232/422/485,其技术简单成熟,性能可靠,价格低廉,所要求的软硬件环境或条件都很低,广泛应用于计算机及相关领域,遍及调制解调器(Modem)、串行打印机、各种监控模块、PLC、摄像头云台、数控机床、单片机及相关智能设备,甚至路由器也不例外(通过串口设置参数)。

在计算机测控系统中,主控机一般采用PC或IPC,通过串口与测控模块相连,测控模块再连接相应的传感器和执行器,形成一个简单的双层结构的计算机测控系统。

这种结构主要用于单独的中小型企业或部门,如果属于综合型企业或部门,如电力系统监控、高速公路监控和收费系统,则可以此为基础结构进行扩充。

用集线器将众多双层监控系统连接起来,再用交换机将若干集线器连接起来,统一接上路由器,从而与Internet互联,形成一个庞大的计算机测控网络。

由此可见,尽管现代计算机的新接口层出不穷,各种网络也日新月异,其规模也越来越大,但是,其基础结构却有不少是串行通信系统,串行通信也成了其中的核心技术。

5.1.1 串口通信的基本概念1.并行通信与串行通信终端与其他设备(例如,其他终端、计算机和外部设备)通过数据传输进行通信。

mfc串口通信发送16进制数据的方法

mfc串口通信发送16进制数据的方法

mfc串口通信发送16进制数据的方法MFC(Microsoft Foundation Class)提供了许多串口通信的功能来发送和接收数据。

在MFC中,我们可以使用CSerialPort类来完成串口通信,并且可以通过该类发送16进制数据。

以下是在MFC中进行串口通信并发送16进制数据的方法:1.创建一个MFC应用程序项目:首先,我们需要创建一个MFC应用程序项目。

打开Visual Studio,选择“创建新项目”,然后选择MFC应用程序向导。

按照向导的指示进行项目的设置,最后创建一个新的MFC应用程序项目。

2.添加CSerialPort类到项目中:在刚创建的MFC应用程序项目中,右击项目名称,选择“添加”->“类”,在弹出的对话框中选择“MFC类”。

在“MFC类向导”中,选择“添加到一个MFC最后调用的类中”,然后点击“完成”按钮。

现在,CSerialPort类将被添加到项目中。

3.初始化串口设置:打开您的对话框类(例如CMyDialog),在头文件中添加头文件#include "SerialPort.h"。

在对话框类的OnInitDialog()函数中,添加以下代码来初始化串口设置:```cppCSerialPort serialPort;if (serialPort.InitPort(1, 9600, 'N', 8, 1)){//初始化串口成功}else{//初始化串口失败}```InitPort()函数用于初始化串口参数,参数分别为:串口号,波特率,奇偶校验位,数据位,停止位。

以上代码中的示例将串口号设置为1,波特率为9600,无奇偶校验位,数据位为8,停止位为1。

4.发送16进制数据:在需要发送数据的地方,我们可以使用以下代码来发送16进制数据:```cppunsigned char hexData[] = { 0x01, 0x02, 0x03 };int dataSize = sizeof(hexData) / sizeof(hexData[0]);serialPort.SendData(hexData, dataSize);```SendData()函数用于发送数据,第一个参数为待发送数据的指针,第二个参数为待发送数据的大小。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。

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

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

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

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

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

希望对各位需要编写串口通信程序的朋友有一些帮助一.串行通信的基本原理串行端口的本质功能是作为CPU和串行设备间的编码转换器。

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

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

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

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

串口通信程序的流程如下图:二.串口信号线的接法一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。

25芯和9芯的主要信号线相同。

以下的介绍是以25芯的RS-232C为例。

①主要信号线定义:2脚:发送数据TXD; 3脚:接收数据RXD; 4脚:请求发送RTS; 5脚:清除发送CTS;6脚:数据设备就绪DSR;20脚:数据终端就绪DTR;8脚:数据载波检测DCD;1脚:保护地; 7脚:信号地。

②电气特性:数据传输速率最大可到20K bps,最大距离仅15m.注:看了微软的MSDN 6.0,其Windows API中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到RS_256000,即256K bps! 也不知道到底是什么串行通讯设备?但不管怎样,一般主机和单片机的串口通讯大多都在9600 bps,可以满足通讯需求。

③接口的典型应用:大多数计算机应用系统与智能单元之间只需使用3到5根信号线即可工作。

这时,除了TXD、RXD以外,还需使用RTS、CTS、DCD、DTR、DSR等信号线。

(当然,在程序中也需要对相应的信号线进行设置。

)以上接法,在设计程序时,直接进行数据的接收和发送就用的场合需要使用握手信号等,需要对相应的信号线的状态进行监测或设置。

)三.16位串口应用程序的简单回顾16位串口应用程序中,使用的16位的Windows API通信函数:① OpenComm()打开串口资源,并指定输入、输出缓冲区的大小(以字节计);CloseComm() 关闭串口;例:int idComDev;idComDev = OpenComm("COM1", 1024, 128);CloseComm(idComDev);②BuildCommDCB()、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置;例:DCB dcb;BuildCommDCB("COM1:2400,n,8,1", &dcb);SetCommState(&dcb);③ReadComm 、WriteComm()对串口进行读写操作,即数据的接收和发送.例:char *m_pRecieve; int count;ReadComm(idComDev,m_pRecieve,count);Char wr[30]; int count2;WriteComm(idComDev,wr,count2);16位下的串口通信程序最大的特点就在于:串口等外部设备的操作有自己特有的API函数;而32位程序则把串口操作(以及并口等)和文件操作统一起来了,使用类似的操作。

四.在MFC下的32位串口应用程序32位下串口通信程序可以用两种方法实现:利用ActiveX控件;使用API 通信函数。

使用ActiveX控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API 通信函数的优缺点则基本上相反。

以下介绍的都是在单文档(SDI)应用程序中加入串口通信能力的程序。

㈠使用ActiveX控件-.-b VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。

使用非常方便,但可惜的是,很少有介绍MSComm控件的资料。

⑴.在当前的Workspace中插入MSComm控件。

Project菜单------>Add to Project---->Components and Controls----->RegisteredActiveX Controls--->选择Components: Microsoft Communications Control,version 6.0 插入到当前的Workspace中。

结果添加了类CMSComm(及相应文件:mscomm.h和mscomm.cpp )。

⑵.在MainFrm.h中加入MSComm控件。

protected:CMSComm m_ComPort;在Mainfrm.cpp::OnCreare()中:DWORD style=WS_VISIBLE|WS_CHILD;if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_C OMMCTRL)){TRACE0("Failed to create OLE Communications Control "); return -1; // fail to create}⑶.初始化串口m_ComPort.SetCommPort(1); //选择COM?m_ComPort. SetInBufferSize(1024); //设置输入缓冲区的大小,Bytesm_ComPort. SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes//if(!m_ComPort.GetPortOpen()) //打开串口m_ComPort.SetPortOpen(TRUE);m_ComPort.SetInputMode(1); //设置输入方式为二进制方式m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数m_ComPort.SetRThreshold(1); //为1表示有一个字符引发一个事件m_ComPort.SetInputLen(0);*⑷.捕捉串口事项。

MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。

我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序。

在程序中需要捕获并处理这些通讯事件。

在MainFrm.h中:protected:afx_msg void OnCommMscomm();DECLARE_EVENTSINK_MAP()在MainFrm.cpp中:BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NON E)//映射ActiveX控件事件END_EVENTSINK_MAP()*⑸.串口读写. 完成读写的函数的确很简单,GetInput()和SetOutput()就可。

两个函数的原型是:VARIANT GetInput();及void SetOutput(const VARIANT& newValue);都要使用VARIANT类型(所有Idispatch::Invoke 的参数和返回值在内部都是作为VARIANT对象处理的)。

无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式)。

查阅VARIANT文档知道,可以用BSTR表示字符串,但遗憾的是所有的BSTR都是包含宽字符,即使我们没有定义_UNICODE_UNICODE 也是这样! WinNT支持宽字符, 而Win95并不支持。

为解决上述问题,我们在实际工作中使用CbyteArray,给出相应的部分程序如下:void CMainFrame::OnCommMscomm(){VARIANT vResponse; int k;if(m_commCtrl.GetCommEvent()==2) {k=m_commCtrl.GetInBufferCount(); //接收到的字符数目if(k>0) {vResponse=m_commCtrl.GetInput(); //readSaveData(k,(unsigned char*) vResponse.parray->pvData);} // 接收到字符,MSComm控件发送事件 }。

// 处理其他MSComm控件}void CMainFrame::OnCommSend() {。

// 准备需要发送的命令,放在TxData[]中CByteArray array;array.RemoveAll();array.SetSize(Count);for(i=0;i<COUNT;I++)array.SetAt(i, TxData[i]);m_ComPort.SetOutput(COleVariant(array)); // 发送数据}请大家认真关注第⑷、⑸中内容,在实际工作中是重点、难点所在。

停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停,以下是32位API通信函数,有空再看!)~.~(……㈡使用32位的API 通信函数:可能很多朋友会觉得奇怪:用32位API函数编写串口通信程序,不就是把16位的API换成32位吗?16位的串口通信程序可是多年之前就有很多人研讨过了……此文主要想介绍一下在API串口通信中如何结合非阻塞通信、多线程等手段,编写出高质量的通信程序。

特别是在CPU处理任务比较繁重、与外围设备中有大量的通信数据时,更有实际意义。

⑴.在中MainFrm.cpp定义全局变量HANDLE hCom; // 准备打开的串口的句柄HANDLE hCommWatchThread ;//辅助线程的全局函数⑵.打开串口,设置串口hCom =CreateFile( "COM2", GENERIC_READ | GENERIC_WRITE, // 允许读写0, // 此项必须为0NULL, // no security attrsOPEN_EXISTING, //设置产生方式FILE_FLAG_OVERLAPPED, // 我们准备使用异步通信NULL );请大家注意,我们使用了FILE_FLAG_OVERLAPPED结构。

相关文档
最新文档