文档库 最新最全的文档下载
当前位置:文档库 › VC6.0MFC串口通信编写全过程

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

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”改为“发送”,功能是按一次就把发送编辑框中的内容发送一次。

C、为以上两个编辑框添加变量,与串口通信控件一样添加,为IDC_EDIT_RXDATA添加CString型变量m_strRXData ;为IDC_EDIT_TXDATA添加CString型变量m_strTXData。说明:m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。

D、添加串口事件消息处理函数OnComm() 打开ClassWizard->Message Maps,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。

这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。在函数中加入如下代码:

代码段1:

void CScommTestDlg::OnComm()

{

// TODO: Add your control notification handler code here

V ARIANT variant_inp;//定义一个V ARIANT类对象

COleSafeArray safearray_inp;//定义一个COleSafeArray对象

LONG len,k;

BYTE rxdata[2048];//设置BYTE数组AN 8—intterthat is not signed.

CString strtemp;

if (m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有数据

{

////以下你可以根据自己的通信协议加入处理代码

variant_inp=m_ctrlComm.GetInput();//读缓冲区

safearray_inp=variant_inp;//V ARIANT型变量转换为ColeSafeArray型变量

len=safearray_inp.GetOneDimSize();

for(k=0;k

{

safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组}

将数组转换为Cstring型变量

BYTE bt=*(char*)(rxdata+k);

如果是HEX显示则转为16进制strtemp.Format("%02x ",bt); //将16进制数送入临时变量strtemp存放else

strtemp.Format("%c",bt);//将字符送入临时变量strtemp 存放 m_strRXData+=strtemp;//加入接收编辑框对应字符串 } }

UpdateData(FALSE);//更新编辑框内容(主要是接收编辑框中的) }

到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。没错吧?那么做下一步:

E 、打开串口和设置串口参数 你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。现在我们在主对话框的CSCommTestDlg::OnInitDialog()打开串口,加入如下代码:

代码段2:

BOOL CSCommTestDlg::OnInitDialog() {

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) {

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING , IDM_ABOUTBOX, strAboutMenu); } }

// Set the icon for this dialog.

//

SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE);

// m_ComboBox.SetCurSel(0);//打开软件时串口选择框默认显示COM1

m_BaudRate_M.SetCurSel(0);//打开软件时波特率选择框默认显示9600 m_Date_Select_M.SetCurSel(0);//打开软件时数据位选择框默认显示8 // m_StopBit_M.SetCurSel(0);//打开软件时停止位选择框默认显示1

// m_ParityCheck_M.SetCurSel(0);//打开软件时奇偶校验选择框默认显示无校验N

//下面if语句用于打开默认串口

/************************************************************/

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");//打开软件时端口设置默认为波特率9600,无校验位,8位数据,1位停止位

m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据

m_ctrlComm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

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()函数,并在函数中添加如下代码:

代码段3:

void CSCommTestDlg::OnButtonManualsend()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE); //读取编辑框内容

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

}

此时运行程序,在发送编辑框中随意输入数,单击发送按钮,若出错则修改后再测试,直到成功再进行以下操作。

5、添加两个“组框”或“静态文本”控件,调整位置及大小,在标师处输入提示文字,这两个控件不用编程,效果如下图:

6、添加5个“静态文本”控件并由属性修改其标题,均不用编程,效果如下图:

7、添加5个“组框”控件,效果如下图:

逐一对各个组框属性编辑如下:

串口号:

常规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最后“确定”

波特率:

常规ID:IDC_COMBO_BaudRate_Select

数据输入列表框项目(N):9600、14400、19200、38400、56000、57600、115200、128000、256000

样式将“分类勾选去掉”

进入类向导添加变量,为IDC_COMBO_BaudRate_Select添加一个value类int型变量m_ BaudRate点击OK后,再添加一个Control类CComboBox型变量m_ BaudRate_M 点击OK最后“确定”

数据位:

常规ID:IDC_COMBO_Date_Select

数据输入列表框项目(N):8、7、6、5、4

样式将“分类勾选去掉”

进入类向导添加变量,为IDC_COMBO_Date_Select添加一个value类int型变量m_Date_Select点击OK后,再添加一个Control类CComboBox型变量m_Date_Select _M点击OK最后“确定”

停止位:

常规ID:IDC_COMBO_StopBit

数据输入列表框项目(N):1、2

样式将“分类勾选去掉”

进入类向导添加变量,为IDC_COMBO_StopBit添加一个value类int型变量

m_StopBit点击OK后,再添加一个Control类CComboBox型变量m_StopBit_M点击

OK最后“确定”

奇偶校验位:

常规ID:IDC_COMBO_ParityCheck

数据输入列表框项目(N):N、O、E、

样式将“分类勾选去掉”

进入类向导添加变量,为IDC_COMBO_ParityCheck添加一个value类int型变量

m_ParityCheck点击OK后,再添加一个Control类CComboBox型变量

m_ParityCheck_M点击OK最后“确定”

说明:以上数据配置添加的Control类CComboBox型变量可能用不到,但value类必须为int型

8、为各个列表框添加处理函数:

A、在建立类向导中Message Maps ,object IDs中选中IDC_COMBO_CommSelect再

在Messages中选中CBN_SELCHANG双击后单击OK,再在Member funtions中双击刚才生成的函数进入程序编辑页面,添加程序代码如下:

代码段4:

void CSCommTestDlg::OnSelchangeCOMBOCommSelect()

{

// TODO: Add your control notification handler code here

m_Index=((CComboBox*)GetDlgItem(IDC_COMBO_CommSelect))->GetCurSel();//当前选中的行

((CComboBox*)GetDlgItem(IDC_COMBO_CommSelect))->SetCurSel(m_Index);//设置当前选中的行的内容为显示的内容

if(m_ctrlComm.GetPortOpen())//当要改变时则要先关闭串口才可以用按键进行打开,

先判断当前串口是否打开

{//如果是打开的则先关闭

m_ctrlComm.SetPortOpen(FALSE);//关闭串口

}

SetDlgItemText(IDC_BUTTON1,"打开串口");//将打开或关才按钮改为"打开串口"

}

B、同理为IDC_COMBO_BaudRate_Select添加处理函数程序代码如下:

代码段5:

void CSCommTestDlg::OnSelchangeCOMBOBaudRateSelect()

{

// TODO: Add your control notification handler code here

UpdateData(true);

m_BaudRate=((CComboBox*)GetDlgItem(IDC_COMBO_BaudRate_Select))->GetCurSel();/

/当前选中的行

////***********************************************************/

///根据当前选中的值进行波特率设置

///************************************************************/

switch(m_BaudRate)

{

case 1: m_ctrlComm.SetSettings("14400,,,");

break;

case 2: m_ctrlComm.SetSettings("19200,,,");

break;

case 3: m_ctrlComm.SetSettings("38400,,,");

break;

case 4: m_ctrlComm.SetSettings("56000,,,");

break;

case 5: m_ctrlComm.SetSettings("57600,,,");

break;

case 6: m_ctrlComm.SetSettings("115200,,,");

break;

case 7: m_ctrlComm.SetSettings("128000,,,");

break;

case 8: m_ctrlComm.SetSettings("256000,,,");

break;

default:m_ctrlComm.SetSettings("9600,,,");

break;

}

//*************************************************////

UpdateData(false);

}

C、同理为IDC_COMBO_Date_Select添加处理函数程序代码如下:

代码段6:

void CSCommTestDlg::OnSelchangeCOMBODateSelect()

{

// TODO: Add your control notification handler code here

UpdateData(true);

m_Date_Select=((CComboBox*)GetDlgItem(IDC_COMBO_Date_Select))->GetCurSel() ;//当前选中的行

///*************************************************************************** ****/

///*************************************************************************** *****/

switch(m_Date_Select)

{

case 1: m_ctrlComm.SetSettings(",,7,");

break;

case 2: m_ctrlComm.SetSettings(",,6,");

break;

case 3: m_ctrlComm.SetSettings(",,5,");

break;

case 4: m_ctrlComm.SetSettings(",,4,");

break;

default:m_ctrlComm.SetSettings(",,8,");

break;

}

//*************************************************************************** ******//

UpdateData(false);

}

D、同理为IDC_COMBO_StopBit添加处理函数程序代码如下:

代码段6:

void CSCommTestDlg::OnSelchangeCOMBOStopBit()

{

// TODO: Add your control notification handler code here

UpdateData(true);

m_StopBit=((CComboBox*)GetDlgItem(IDC_COMBO_StopBit))->GetCurSel();//当前选中的行

///*************************************************************************** ****/

///*************************************************************************** *****/

switch(m_StopBit)

{

case 1: m_ctrlComm.SetSettings(",,,2");

break;

default:m_ctrlComm.SetSettings(",,,1");

break;

}

//*************************************************************************** ******//

UpdateData(false);

}

E、同理为IDC_COMBO_ParityCheck添加处理函数程序代码如下:

代码段7:

void CSCommTestDlg::OnSelchangeCOMBOParityCheck()

{

// TODO: Add your control notification handler code here

UpdateData(true);

m_ParityCheck=((CComboBox*)GetDlgItem(IDC_COMBO_ParityCheck))->GetCurSel();//当前选中的行

///*************************************************************************** ****/

///*************************************************************************** *****/

switch(m_ParityCheck)

{

case 1: m_ctrlComm.SetSettings(",O,,");

break;

case 2: m_ctrlComm.SetSettings(",O,,");

break;

default:m_ctrlComm.SetSettings(",N,,");

break;

}

//*************************************************************************** ******//

UpdateData(false);

}

此时应将代码段2:提示4中所指的那5个语句前的“//”删除

9、串口添加打开或关闭按钮

以同样的方式添加按钮,并将标题修改为“关闭串口”字样,为此按钮添加处理函数程序代码如下:

代码段8:

void CSCommTestDlg::OnButton1Start()

{

//检查是否改变默认的串口值,没有改变m_Index的值是0的,否则则不为0

if(m_Index<0)//串口的默认值没有改变

{

switch(m_ctrlComm.GetPortOpen())//点击打开或关闭串口按键时,根据当前串口是否打开进行相应操作

{

case 1: /**************************************************************

关闭串口前先将自动发送功能关闭

***************************************************************/

SetDlgItemText(IDC_BUTTON_AutoSend,"自动发送");//更改按键指示

KillTimer(1);

/**************************************************************/

//当前串口是打开的则进行关串口操作

m_ctrlComm.SetPortOpen(FALSE);//关闭串口

SetDlgItemText(IDC_BUTTON1,"打开串口");//更改按键指示

UpdateData(FALSE);//更新按键状态

break;

case 0://当前串口是关闭的则进行开串口操作

m_ctrlComm.SetCommPort(1);//如果要打开串口则应先选择哪个串口

m_ctrlComm.SetPortOpen(TRUE);//打开串口

SetDlgItemText(IDC_BUTTON1,"关闭串口");//更改按键指示

UpdateData(FALSE);

break;

default : AfxMessageBox("cannot open or close serial port");

}

}

else//串口的默认值有改变

{

switch(m_ctrlComm.GetPortOpen())//点击打开或关闭串口按键时,根据当前串口是否打开进行相应操作

{

case 0://当前串口是关闭的则进行开串口操作

m_ctrlComm.SetCommPort(m_Index+1);//如果要打开串口则应先选择哪个串口

m_ctrlComm.SetPortOpen(TRUE);//打开串口

SetDlgItemText(IDC_BUTTON1,"关闭串口");//更改按键指示

UpdateData(FALSE);//更新按键状态

break;

case 1: /************************************************************** 关闭串口前先将自动发送功能关闭

***************************************************************/

SetDlgItemText(IDC_BUTTON_AutoSend,"自动发送");//更改按键指示

KillTimer(1);

/**************************************************************/

//当前串口是打开的则进行关串口操作

m_ctrlComm.SetPortOpen(FALSE);

SetDlgItemText(IDC_BUTTON1,"打开串口");

UpdateData(FALSE);

break;

default : AfxMessageBox("cannot open serial port");

}

}

if(m_Index<0)

((CComboBox*)GetDlgItem(IDC_COMBO_CommSelect))->SetCurSel(0);//如果没有另外进行串口选择则显示COM1

if(m_BaudRate<0)

((CComboBox*)GetDlgItem(IDC_COMBO_BaudRate_Select))->SetCurSel(0);//如果没有另外进行波特率选择则显示9600

if(m_Date_Select<0)

((CComboBox*)GetDlgItem(IDC_COMBO_Date_Select))->SetCurSel(0);////如果没有另外进行数据位选择则显示8

if(m_StopBit<0)

((CComboBox*)GetDlgItem(IDC_COMBO_StopBit))->SetCurSel(0);//如果没有另外进行停止位选择则显示1

if(m_ParityCheck<0)

((CComboBox*)GetDlgItem(IDC_COMBO_ParityCheck))->SetCurSel(0);//如果没有另外进行校验位选择则显示没有校验位N

}

10、添加自动发送功能:

A、添加一个“编辑框”控件,此控件用于获取自动发送的时间间隔的,修改其ID 为IDC_EDIT_Timer,为其添加一个value类UINT型变量m_Timer

B、添加一个“按钮”控件,修改其ID为IDC_BUTTON_AutoSend修改其标题为“自动发送”

C、添加一个“按钮”控件,修改其ID为IDC_BUTTON_StopAutoSend修改其标题为“停止自动发送”

D、为“自动发送”按钮添加BN_CLICKED处理函数,程序代码如下:

代码段9:

void CSCommTestDlg::OnBUTTONAutoSend()

{

UpdateData(TRUE);

if(m_Timer<=0)//判断是否设置自动发送时间间隔

AfxMessageBox("请设置自动发送时间间隔");

else if(!m_ctrlComm.GetPortOpen())//判断是否打开串口

AfxMessageBox("请打开串口");

else

{SetDlgItemText(IDC_BUTTON_AutoSend,"自动发送...");//更改按键指示

SetTimer(1,m_Timer,NULL);}

}

E、为“停止自动发送”按钮添加BN_CLICKED处理函数,程序代码如下:

代码段9:

void CSCommTestDlg::OnBUTTONStopAutoSend()

{

// TODO: Add your control notification handler code here

SetDlgItemText(IDC_BUTTON_AutoSend,"自动发送");//更改按键指示

KillTimer(1);

}

F、因为要设置自发送,所以要添加一个Windows定时函数,步骤如下:

进入类向导,Message Maps中的Object IDs中选择CScommTestDlg再选择Messages中的WM_TIMER,进入TIMER函数后,添加如下程序代码如下:

代码段10:

void CSCommTestDlg::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

UpdateData(TRUE);

if(m_ctrlHexSend.GetCheck())

{

CByteArray hexdate;

int len=String2Hex(m_strTXData,hexdate);

m_ctrlComm.SetOutput(COleVariant(hexdate));

}

else

m_ctrlComm.SetOutput(COleVariant(m_strTXData));

CDialog::OnTimer(nIDEvent);

}

11、十六进制数据发送及接收显示

添加一个“复选框”控件,修改ID为IDC_CHECK_HexSend,标题为“HEX发送”,进入类向导添加control类CButton型变量,变量名为m_ctrlHexSend,然后为为

SCommTestDlg类添加以下两个PUBLIC成员函数,在Class view中右击

CCommTestDlg选中Add Member Function…然后在函数类型中输入“int”,在

函数描述中输入“String2Hex(CString str, CByteArray &senddate)”然后确定。编

辑函数体如下:

代码段11:

int CSCommTestDlg::String2Hex(CString str, CByteArray &senddate)

{

int hexdate,lowhexdate;

int hexdatelen=0;

int len=str.GetLength();

senddate.SetSize(len/2);

for(int i=0;i

{

char lstr,hstr=str[i];

if(hstr==' ')

{

i++;

continue;

}

i++;

if(i>=len)

break;

lstr=str[i];

hexdate=ConvertHexChar(hstr);

lowhexdate=ConvertHexChar(lstr);

if((hexdate==16)||(lowhexdate==16))

break;

else

hexdate=hexdate*16+lowhexdate;

i++;

senddate[hexdatelen]=(char)hexdate;

hexdatelen++;

}

senddate.SetSize(hexdatelen);

return hexdatelen;

}

再添加别一个CCommTestDlg添加两个成员函数,在函数类型中输入“char”,在函数描述中输入“ConvertHexChar(char ch)”然后确定。编辑函数体如下:

代码段12:

char CSCommTestDlg::ConvertHexChar(char ch)

{

if((ch>='0')&&(ch<='9'))

{

return ch-0x30;

}

else if((ch>='A')&&(ch<='F'))

{

return ch-'A'+10;

}

else if((ch>='a')&&(ch<='f'))

{

return ch-'a'+10;

}

else

return (-1);

}

再将CSCommTestDlg::OnButtonManualsend()修改成以下形式:

代码段13:

void CSCommTestDlg::OnButtonManualsend()

{

// TODO: Add your control notification handler code here

if(!m_ctrlComm.GetPortOpen())//判断是否打开串口

AfxMessageBox("请打开串口");

else

{

UpdateData(TRUE);

if(m_ctrlHexSend.GetCheck())//判断是否是自动发送

{

CByteArray hexdate;

int len=String2Hex(m_strTXData,hexdate);

m_ctrlComm.SetOutput(COleVariant(hexdate));

}

else

m_ctrlComm.SetOutput(COleVariant(m_strTXData));

}

}

在接收框中以十六进制显示

将代码段1,提示2的三句程序代码前的“//”去掉即可。

至此,基本功能已完成,编译运行程序是否能实现各功能,如果出错,则细仔改正,再通过添加“组合框”控件或“静态文本”可以添加相应提示,再由菜单栏中的布局内的各种功能选择可以实现将各控件整齐排列效果如下:

12、保存数据功能

添加一个按钮控件,ID为IDC_BUTTON_SaveData,标题为:保存数据,添加两个“复选框”控件,一个ID为IDC_CHECK_HEXSave,标题为:HEX保存,另一个ID为IDC_CHECK_BCDSave,标题为:BCD保存,选择HEX保存则保存的数据为十六进制数据,选择BCD保存则保存的数据为十进制数据,但不可两都同时选择,再为两个复选框选添加两个control类CButton型变量,一个变量名为:m_HEXSave,另一个为m_BCDSave;为“保存数据”按钮添加一个BN_CLICKED 函数;另外再为为SCommTestDlg类添加以下两个PUBLIC成员函数,此函数只要用于十六进制与十进制数据之间的转换,函数类型为CString,函数描述为HEX_To_BCD(CString HexData),函数体如下:

代码段13:

再为“保存数据”按钮添,的BN_CLICKED函数添加函数体,代码如下:

代码段14:

13:清除数据:

添加一个“清除数据”按钮控件,ID为IDC_BUTTON_CleanRXData,标题为:清空数据区,添加一个BN_CLICKED函数,函数体代码如下:

代码段14:

void CSCommTestDlg::OnBUTTONCleanRXData()

{

// TODO: Add your control notification handler code here

m_strRXData.Empty();

UpdateData(FALSE);

}

至此其串口调试助手其本功能已全部实现,编译程序运行后效果如下:

C语言串口通信助手代码

该程序全部由C写成没有C++ 更没用MFC 完全是自娱自乐给需要的人一个参考 #include "stdafx.h" #include #include "resource.h" #include "MainDlg.h" #include #include #include HANDLE hComm;//用于获取串口打开函数的返回值(句柄或错误值)OVERLAPPED m_ov; COMSTAT comstat; DWORD m_dwCommEvents;

TCHAR cRecs[200],cSends[100]; //接收字符串发送字符串 char j=0,*cCom; //接收用统计数据大小变量端口选择 BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); } return FALSE; } /*系统初始化函数*/ BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND hwndCombo1=GetDlgItem(hwnd,IDC_COMBO1); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM1")); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM2"));

VC与c51串口通讯程序

跟着步骤学习 1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest 2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了), 这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw 文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标 将此图标拖到对话框中,程序运行后,这个图标是看不到的。 3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard ->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1 添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动 加入了//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。 4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显 示数据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分别用来放入接收和发送的字符数据。 5.添加串口事件消息处理函数OnComm()打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。 这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在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; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k

c语言串口通信范例

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)();

static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);

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

其于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 确定

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.wendangku.net/doc/3c10005539.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

c语言串口通信范例

c语言串口通信范例 This manuscript was revised by the office on December 22, 2012

一个c语言的串口通信程序范例 标签:分类: 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include <> #include <> #include <> #include <> #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20

static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100);

VC++_串口上位机编程实例

VC++串口上位机简单例程(源码及详细步骤) (4.33MB) VC++编写简单串口上位机程序 2010年4月13日10:23:40 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。 编译环境:VC++6.0 操作系统:VMWare虚拟出来的Windows XP 程序实现功能: 1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。PC的COM口编号可以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转

换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。(见文章末尾图) 3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。 程序的编写: 1、打开VC++6.0建立基于对话框的MFC应用程序Test,

2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control,version6.0->Insert,按

C语言串口通信-源代码

#include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data);

(完整版)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 确 定

VCMSComm串口发送与接收上位机制做总结

VC++MSComm串口发送与接收上位机本设计用VC编写的一个简单的上位机软件,实现功能为:简单的串口数据发送与接收。 具体步骤如下: 一.建立应用程序工程“串口通信_韩季方01” 1.打开VC++6.0—》建立对话框MFC应用程序:串口通信_韩季方01—》 添加基本控件如图1.0。 图1.0 2.添加MSComm控件:Add To Project—》Components and Controls…打开如图1.1,双击“Registered ActiveX Contronls”项—》出现如图1.2—》选择“Microsoft Communications Control,version 6.0”控件—》点击“Insert”—》提示“…”确认即可—》弹出图1.3—》点击“OK”—》再点击“Close”。 下一步,将对话框资源控件中的电话状控件托到对话框中即可,如图1.4。

图1.1 图1.2

图1.3 图1.4 3.编辑控件及其属性设置:如表1.0

4.添加变量及其类型方法如图1.5 图1.5 二.初始化串口:设置MSComm控件属性 打开Class Wizard—》Member Variables—》选IDC_MSCOMM1—》点击“Add Varialbe…”—》添加变量m_ctrlComm。如图1.5。 之后,在工作空间打开文件如图2.0—》在函数OnInitDialog中添加代码如图2.1。

图2.0

图2.1 三.添加串口事件消息处理函数OnComm() 打开Class Wizard—》Member Maps—》Class Name中选择C_01Dlg—》在Object Ids中选择IDC_MSCOMM1—》在Message中选中OnComm—》单击“Add Function”按钮—》将函数名改为OnComm(好记而已)—》单击OK,完成后如图3.0 同理在函数OnComm()中添加代码如图3.1

如何用VC++实现串口通信

用VC 6.0实现串行通信的三种方法 中国科学院王颖 ---- 摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。 ---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。依据不同的条件实现对串口的灵活编程控制是我们所需要的。 ---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。串行通信程序开发环境为VC++ 6.0。 ---- Windows下串行通信 ---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows 操作系统提供的设备驱动程序来进行数据传递。串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。以下将结合实例,给出实现串行通信的三种方法。 ---- 实现串行通信的三种方法 ---- 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control 工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对Windows 通讯驱动程序的API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。 ---- 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性: ---- CommPort 设置并返回通讯端口号,缺省为COM1。 ---- Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 ---- PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。 ---- Input 从接收缓冲区返回和删除字符。 ---- Output 向发送缓冲区写一个字符串。 ---- InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内

用C编写的RS232串口通信程序

void main() { delayms(100); init(); //初始化系统 delayms(100); init_wdt(); //初始化看门狗 while(1) { while(!RI_0) //是否收到数据 { clr_wdt(); } RI_0=0; //清除接收中断标志 buffer=S0BUF; if(buffer==0x5a) //检测祯头0 start0=1; if(buffer==0x54) //检测祯头1 start1=1; if(buffer==0x5a) //检测祯尾0 end0=1; if(buffer==0xfe) //检测祯尾1 end1=1; if((start0==1)&(start1==1)) { buff[i]=buffer; //从祯头1开始存储数据 i++; } if((end0==1)&(end1==1)) //是否已经接收祯尾 { count=i; //数据长度为count个 i=1; if((buff[2]==0x03)&(count==107)) //是否422指令 { buff[0]=0x5a; //重填祯头0 buff[count-4]=0; //校验和清零 for(k=2;k<(count-4);k++) //计算校验和 { buff[count-4]+=buff[k]; } for(k=0;k

S0BUF=buff[k]; while(!TI_0); //等待发送完成 TI_0=0; //清除发送中断标志 } reset(); } else if((buff[2]==0x05)&(count==7)) //是否AD测试指令 { sendad(); reset(); } else if((buff[2]==0x18)&(count==7)) //是否发送时序信号指令 { sendpaulse(); reset(); } else //如果接收错误,则恢复各标志位为初始状态以便下次接收 { reset(); } } } } void reset() { start0=0; //祯头祯尾标志位清零 start1=0; end0=0; end1=0; for(k=0;k

VC串口通信实例 MSComm

VC串口通信实例 MSComm 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。随着计算机技术的发展和推广,利用串口进行数据通讯在通讯领域中占有着重要的地位。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度慢。串行通信的距离可以从几米到几千米。利用串口进行数据通讯在通讯领域中占有着重要的地位,串口通讯在通讯软件中有着十分广泛的应用。如电话、传真、视频和各种控制等。串口通讯目前流行的方法大概有三种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。二是利用WINAPI函数进行编程,这种编程的难度高,要求掌握很多的API 函数。三是利用现在网络上面提供的一些串口通讯控件进行编写。这三种方法都没有同Windows服务联系起来。 串行接口输入输出过程描述 串行接口包括4个主要寄存器,即控制寄存器、状态寄存器、数据输入寄存器及数据输出寄存器。控制寄存器用来接收CPU送给此接口的各种控制信息,而控制信息决定接口的工作方式。状态寄存器的各位叫状态位,每一个状态位都可以用来指示传输过程中的某一种错误或当前传输状态。数据输入寄存器总是和串行输入/并行输出移位寄存器配对使用的。在输入过程中,数据一位一位从外部设备进入接口的寄存器,当接收完一个数据后,数据就从移位寄存器送到输入寄存器,再等待CPU来取走。输出的情况与输入过程类似,在输出过程中,数据输出寄存器与并行输入/串行输出移位寄存器配对使用。当CPU往数据输出寄存器中输出一个数据后,数据便传输到移位寄存器,然后一位一位地通过输出线送到外设。串行通信数据的收发方式分为异步通信方式与同步通信方式。

MFC串口通信编程详解解析

MFC串口通信编程介绍 主要介绍了用CreateFile(函数和WriteFile(函数读写串口的实例,以及设置串口属性的实例. 在工业控制中,工控机(一般都基于Windows平台经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点.每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答. 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活.下面只介绍API串口通信部分. 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式.同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中, 虽然不会阻塞主线程,但是仍然会阻塞监听线程;而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞. 无论哪种操作方式,一般都通过四个步骤来完成: (1打开串口 (2配置串口 (3读写串口 (4关闭串口

一打开串口 Win32系统把文件的概念进行了扩展.无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的.该函数的原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile; ?lpFileName:将要打开的串口逻辑名,如“COM1”; ?dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; ?dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0; ?lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; ?dwCreationDistribution:创建标志,对串口操作该参数必须置为 OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操 作;

c语言串口通信范例

c语言串口通信范例标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]

一个c语言的串口通信程序范例 标签:分类: 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include <> #include <> #include <> #include <> #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20

static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; ?

串口通信linux c语言实现

/*write*/ #include #include #include #include #include #include #define MAX_SIZE 30 void set_speed(int,int); int main(int argc,char **argv) { int fd; int flag; int write_num=0; struct termios term; speed_t baud_rate_i; speed_t baud_rate_o; char buff[MAX_SIZE]="hello,beautiful day!"; fd=open(argv[1],O_RDWR|O_NONBLOCK); if(fd<0) printf("open the COM1 error!\n"); else printf("open COM1 ok!\n"); flag=tcgetattr(fd,&term); baud_rate_i=cfgetispeed(&term); baud_rate_o=cfgetospeed(&term); printf("%d,%d\n",baud_rate_i,baud_rate_o); set_speed(fd,9600); flag=tcgetattr(fd,&term); baud_rate_i=cfgetispeed(&term); baud_rate_o=cfgetospeed(&term); printf("%d,%d\n",baud_rate_i,baud_rate_o); while(1) { buff[29]='\n'; write_num=write(fd,buff,sizeof(buff));

VC++串口通信编程

在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX 控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。 无论那种操作方式,一般都通过四个步骤来完成: (1)打开串口 (2)配置串口 (3)读写串口 (4)关闭串口 (1)打开串口 Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); ?lpFileName:将要打开的串口逻辑名,如“COM1”; ?dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; ?dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0; ?lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; ?dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同 步I/O操作; ?hTemplateFile:对串口而言该参数必须置为NULL;

VC串口编程API详解

V C串口编程A P I详解集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

V C++串口编程主要A P I详解该文档是本人在刚刚接触到VC++下的串口编程时,总结归纳的一些主要的API函数,可以帮助初学者更好的理解串口编程的方法。 1.打开串口 HANDLECreateFile(LPCTSTRlpFileName, DWORDdwDesiredAccess, DWORDdwShareMode, LPSECURITY_ATTRIBUTESlpSecurityAttributes, DWORDdwCreationDistribution, DWORDdwFlagsAndAttributes, HANDLEhTemplateFile); 参数: lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;

dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING; dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作,本工程采用异步方式; hTemplateFile:对串口而言该参数必须置为NULL; 2.获取串口设备控制块DCB BOOLGetCommState( HANDLEhFile, //标识通讯端口的句柄,由CreateFile()函数返回的句柄 LPDCBlpDCB //指向一个设备控制块(DCB结构)的指针 ); 3.设置串口设备控制块DCB BOOLSetCommState( HANDLEhFile,//标识通讯端口的句柄,由CreateFile()函数返回的句柄LPDCBlpDCB//指向一个设备控制块(DCB结构)的指针 ); 4.设置串口输入输出缓冲区大小 BOOLSetupComm( HANDLEhFile, //通信设备的句柄DWORDdwInQueue, //输入缓冲区的大小(字节数)DWORDdwOutQueue //输出缓冲区的大小(字节数)

相关文档