关于串口调试助手VC源程序及详细编程过程

一、关于串口调试助手VC源程序及详细编程过程

这样你每接受一个字符,如:strtemp.Format(“%X”,bt);就把这个字符串的没一位转换成十进制,然后,把第一个十进制左移4位,然后加上后一个十进制数字,得出的结果也就是你要的数字,这个方法我测试过,一定行的注意:你这个for(k=0;k

关于串口调试助手VC源程序及详细编程过程

二、求串口调试助手的VC++源代码

打开VC++6.0,新建基于对话框的工程RS485Comm,在主对话框窗口IDD_RS485COMM_DIALOG上添加两个按钮,ID分别为IDC_SEND和IDC_RECEIVE,标题分别为“发送”和“接收”;添加一个静态文本框IDC_DISP,用于显示串口接收到的内容。

在RS485CommDlg.cpp文件中添加全局变量:

HANDLE

hCom;

//全局变量,串口句柄

在RS485CommDlg.cpp文件中的OnInitDialog()函数添加如下代码:

//

TODO:

Add

extra

initialization

here

hCom=CreateFile(“COM1”,//COM1口

GENERIC_READ|GENERIC_WRITE,

//允许读和写

0,

//独占方式

NULL,

OPEN_EXISTING,

//打开而不是创建

0,

//同步方式

NULL);

if(hCom==(HANDLE)-1)

{

AfxMessageBox(“打开COM失败!”);

return

FALSE;

}

SetupComm(hCom,100,100);

//输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS

TimeOuts;

//设定读超时

TimeOuts.ReadIntervalTimeout=MAXDWORD;

TimeOuts.ReadTotalTimeoutMultiplier=0;

TimeOuts.ReadTotalTimeoutConstant=0;

//在读一次输入缓冲区的内容后读操作就立即返回,

//而不管是否读入了要求的字符。

//设定写超时

TimeOuts.WriteTotalTimeoutMultiplier=100;

TimeOuts.WriteTotalTimeoutConstant=500;

SetCommTimeouts(hCom,&TimeOuts);

//设置超时

DCB

dcb;

GetCommState(hCom,&dcb);

dcb.BaudRate=9600;

//波特率为9600

dcb.ByteSize=8;

//每个字节有8位

dcb.Parity=NOPARITY;

//无奇偶校验位

dcb.StopBits=TWOSTOPBITS;

//两个停止位

SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

分别双击IDC_SEND按钮和IDC_RECEIVE按钮,添加两个按钮的响应函数:

void

CRS485CommDlg::OnSend()

{

//

TODO:

Add

your

control

notification

handler

code

here

//

在此需要简单介绍百特公司XMA5000的通讯协议:

//该仪表RS485通讯采用主机广播方式通讯。

//串行半双工,帧11位,1个起始位(0),8个数据位,2个停止位(1)

//如:读仪表显示的瞬时值,主机发送:DC1

AAA

BB

ETX

//其中:DC1是标准ASCII码的一个控制符号,码值为11H(十进制的17)

//在XMA5000的通讯协议中,DC1表示读瞬时值

//AAA是从机地址码,也就是XMA5000显示仪表的通讯地址

//BB为通道号,读瞬时值时该值为01

//ETX也是标准ASCII码的一个控制符号,码值为03H

//在XMA5000的通讯协议中,ETX表示主机结束符

char

lpOutBuffer[7];

memset(lpOutBuffer,“\0”,7);

//前7个字节先清零

lpOutBuffer[0]=“\x11”;

//发送缓冲区的第1个字节为DC1

lpOutBuffer[1]=“0”;

//第2个字节为字符0(30H)

lpOutBuffer[2]=“0”;

//第3个字节为字符0(30H)

lpOutBuffer[3]=“1”;

//

第4个字节为字符1(31H)

lpOutBuffer[4]=“0”;

//第5个字节为字符0(30H)

lpOutBuffer[5]=“1”;

//第6个字节为字符1(31H)

lpOutBuffer[6]=“\x03”;

//第7个字节为字符ETX

//从该段代码可以看出,仪表的通讯地址为001

DWORD

dwBytesWrite=7;

COMSTAT

ComStat;

DWORD

dwErrorFlags;

BOOL

bWriteStat;

ClearCommError(hCom,&dwErrorFlags,&ComStat);

bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,&

dwBytesWrite,NULL);

if(!bWriteStat)

{

AfxMessageBox(“写串口失败!”);

}

}

void

CRS485CommDlg::OnReceive()

{

//

TODO:

Add

your

control

notification

handler

code

here

char

str[100];

memset(str,“\0”,100);

DWORD

wCount=100;//读取的字节数

BOOL

bReadStat;

bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);

if(!bReadStat)

AfxMessageBox(“读串口失败!”);

PurgeComm(hCom,

PURGE_TXABORT|

PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

m_disp=str;

UpdateData(FALSE);

}

您可以观察返回的字符串,其中有和仪表显示值相同的部分,您可以进行相应的字符串操作取出仪表的显示值。

打开ClassWizard,为静态文本框IDC_DISP添加CString类型变量m_disp,同时添加WM_CLOSE的相应函数:

void

CRS485CommDlg::OnClose()

{

//

TODO:

Add

your

message

handler

code

here

and/or

call

default

CloseHandle(hCom);

//程序退出时关闭串口

CDialog::OnClose();

}

程序的相应部分已经在代码内部作了详细介绍。连接好硬件部分,编译运行程序,细心体会串口同步操作部分。

本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。