当前位置:文档之家› 纯业余者用VC(MFC)编写串口调试助手(含VC6工程源文件)

纯业余者用VC(MFC)编写串口调试助手(含VC6工程源文件)

纯业余者用VC(MFC)编写串口调试助手(含VC6工程源文件)
纯业余者用VC(MFC)编写串口调试助手(含VC6工程源文件)

纯业余者用VC(MFC)编写串口调试助手

1.序

毕业到现在,转眼就做射频开发10年了,一直从事直放站、干放等通信边缘行业,从低噪放、锁相源、选频、功放到整机,射频就那么点东西,而且越来越集成化,软件无线电是必然趋势。做射频从业面会越来越窄,我知道所有人都会说,当你成为专家的时候,一切就都不是问题,可有几个真正的专家,再者说,射频需要经验的积累,只有实际项目做的越多越广,经验也就积累得越多,并不是一朝一夕能达到的。

前不久突然觉得,我的射频模块控制要是也是自己来编程控制多好啊!那就得学单片机编程,学习上位机编程了,可我都不会啊,要不就先来整整上位机,windows方面的。大学唯一学的编程语言是C语言,可根本不能理解用C做什么,还都还给老师10多年了,这怎么办?从BASIC,C/C++,JAVA,PASCAL搜索了一圈,还是选C++吧,毕竟是C 语言发展而来,用VC环境,身边有可以请教的人。在网上转悠了很久,发现《windows

程序设计》是必看,《MFC Windows程序设计》是学MFC最经典的书籍。OMG,这些书啊,都是上千页的,白天都在上班,哪有时间看哦,只有先下载下来作为参考资料了。

扯远了啊。这也不行那也不行,怎么办呢?干脆硬着头皮上吧,找几个实例照搬,再修修改改加深理解吧。

第一个目标,自己编写个串口调试助手,掌握串口通信编程,这样上位机的编写就有希望了。

好了,目标定下来了。网上下载了个串口调试助手,确定基本功能:

1.自动寻找串口,并自动添加到下拉框中共选择;

2.有波特率、数据位、停止位、校验位的选择设置;

3.串口打开控制按钮;

4.发送、清除按钮;

5.接收是自动实现的;

6.有定时自动发送功能;

7.有传送文件功能;

8.有状态栏显示,指示串口状态,设置参数和发送接收显示。

下面就一步步实现,本人纯业余,只是记录下来这个学习过程,请勿拍砖。

开发平台Visual C++6.0英文版,电脑是i7-2670Q四核8G内存1G独显的笔记本,装的win7 64位旗舰版,因此VC6兼容不是太好,有些小毛病,不过不影响编写。

2.创建MFC项目

File -> New -> Projects选择MFC AppWizard(exe),项目名称commassist

选择OK

选中Dialog based,点击Next> 。

默认选项,点击Next> ,

继续默认选项,点击Next> ,如果选中As a statically linked library,生产的EXE可直接在没装VC的机器上运行。可以在项目中进行更改。

选择第二个CCommassistDlg,点击Finish

点击OK。项目创建完毕,进入项目。

删除界面上确定和取消按钮以及静态文字。

保存后便可以开始创建界面了。

参考界面

仿照设计的界面,具体添加按钮或编辑框等的布局步骤就不用细说了。

4.图标修改

在资源视图中选择Icon右键InsertIcon加入打开和关闭的Icon图标或自行绘制,如下图

IDR_MAINFRAME原为MFC提供的图标,这里我直接改成自己的,生成EXE后将会显示这个图标。下面将帮助页面图标也改为自绘图标。

在打开按钮旁边加入自绘的打开和关闭图标:先加入工具条中的Picture,然后选中右键看属性,并如图将Image选为默认的IDI_ICON_CLOSE。如下图

5.基本设置

下面对各个按钮及编辑框设置进行描述

右键串口对应的Combo Box,ID设置为IDC_COMLIST,Type设置为Drop List,Sort不选择(我系统是WIN7 64位,不选中反而自动排序,至于XP得试试看了,以下的选择相同)。右键波特率对应的Combo Box,ID设置为IDC_BAUD,Type及Sort同上。

右键数据位对应的Combo Box,ID设置为IDC_BDATA,Type及Sort同上。

右键停止位对应的Combo Box,ID设置为IDC_BSTOP,Type及Sort同上。

右键校验位对应的Combo Box,ID设置为IDC_CAL,Type及Sort同上。

每个下拉框要点击右边的小箭头,然后将其拉长,不然显示不出内容。

接收EDIT框ID设置为IDC_EDIT_RX。

发送EDIT框ID设置为IDC_EDIT_TX。

自动发送时间间隔的EDIT框ID设置为IDC_EDIT_TIMER。

选择文件后面的EDIT框ID设置为IDC_EDIT_FILEPATH。

接收区的十六进制显示的Check Box复选框ID设置为IDC_CHECK_HEXRX。

发送区的十六进制发送的Check Box复选框ID设置为IDC_CHECK_HEXTX。

按钮“打开串口”ID设置为IDC_COMCONTROL。

按钮“清空显示区”ID设置为IDC_BTN_CLRRX。

按钮“手动发送”ID设置为IDC_BTN_HANDSEND。

按钮“清空发送区”ID设置为IDC_BTN_CLRTX。

按钮“自动发送”ID设置为IDC_BTN_AUTOSEND。

按钮“选择文件”ID设置为IDC_BTN_SELCTFILE。

按钮“发送文件”ID设置为IDC_BTN_SENDFILE。

6.开始写代码

6.1. 基本思路:

因为串口通信部分代码我可能用在以后的单片机上位机上,因此考虑单独形成CPP和H文件,定义为comm.cpp和comm.h。在comm.cpp中编写串口创建、打开、关闭以及串口监听线程(用于自动接收)的代码,同时加入进制转换或显示的函数,这些在comm.h文件中申明,在主对话框中包含comm.h即可。

想修改按钮样式,在网上搜了一圈,结果不轻松,最后确定创建新类来实现。

6.2. 创建自定义按钮类:

View -> Class Wizard选择Add Class -> New,名字MyButton,基类选择CButton。

在头文件MyButton.h 中加入以下变量和函数定义:

private:

int m_Style; //按钮形状(0-正常,1-当前,2-按下,3-锁定)

bool b_InRect; //鼠标进入标志

CString m_strText; //按钮文字

COLORREF m_ForeColor;//文本颜色

COLORREF m_MouseInColor;//鼠标进入时文本颜色

COLORREF m_BackColor;//背景颜色

COLORREF m_LockForeColor; //锁定按钮的文字颜色

CRect m_ButRect; //按钮尺寸

CFont* p_Font; //字体

void DrawButton(CDC *pDC); //画正常按钮

// 接口函数

public:

MyButton();

void SetText(CString str); //设置文字

void SetForeColor(COLORREF color); //设置文本颜色

void SetBkColor(COLORREF color); //设置背景颜色

void SetTextFont(int FontHight,LPCTSTR FontName); //设置字体

在MyButton.cpp 的构造函数中初始化变量:

m_Style = 1; //m_Style = 0; //按钮形状风格

b_InRect = false; //鼠标进入标志

m_strText = _T(""); //按钮文字(使用默认文字)

m_ForeColor = RGB(0,0,0); //文字颜色(黑色)

m_MouseInColor = RGB(0,0,255); //鼠标进入时文字颜色(蓝色)

m_BackColor = RGB(230,230,230); //m_BackColor = RGB(243,243,243); //背景色(灰白色)

m_LockForeColor = GetSysColor(COLOR_GRAYTEXT); //锁定按钮的文字颜色

p_Font = NULL; //字体指针

用ClassWizard添加下列消息函数:

PreSubclassWindow();

DrawItem();

onMouseMove();

OnLButtonDown();

OnLButtonUp();

在各函数内加入代码:

void MyButton::PreSubclassWindow()

{

// TODO: Add your specialized code here and/or call the base class

ModifyStyle( 0, BS_OWNERDRAW ); //设置按钮属性为自画式

//PreSubclassWindow()在按钮创建前自动执行,所以我们可以在其中做一些初始工作。

//这里只做了一项工作,就是为按钮设置属性为“自绘”式,这样,用户在添加按钮后,就不需设置“Owner draw”属性了。

CButton::PreSubclassWindow();

}

void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

{

// TODO: Add your code to draw the specified item

CDC *pDC = CDC::FromHandle( lpDrawItemStruct->hDC );

m_ButRect = lpDrawItemStruct->rcItem; //获取按钮尺寸

if( m_strText.IsEmpty() )

GetWindowText( m_strText ); //获取按钮文本

int nSavedDC = pDC->SaveDC();

VERIFY( pDC );

DrawButton( pDC ); //绘制按钮

pDC->RestoreDC( nSavedDC );

}

//DrawItem()函数是一个关键函数,按钮的绘制工作就在这里进行,它的作用相当于对话框中的OnPaint()函数和视图中的OnDraw()函数。

//这里我做了三项工作:获取按钮尺寸、获取按钮文本、绘制按钮。其中绘制工作在自定义函数DrawButton()中完成。以下就是绘制过程:

void MyButton::DrawButton(CDC *pDC)

{

//调整状态

if( m_Style==3 ) m_Style = 0;

if( GetStyle() & WS_DISABLED )

m_Style = 3; //禁止状态

//根据状态调整边框颜色和文字颜色

COLORREF bColor, fColor; //bColor为边框颜色,fColor为文字颜色

switch( m_Style )

{

case 0: bColor = RGB(192,192,192); fColor = m_ForeColor; break; //正常按钮

case 1: bColor = RGB(255,255,255); fColor = m_ForeColor; break; //鼠标进入时按钮case 2: bColor = RGB(192,192,192); fColor = m_MouseInColor; break; //按下的按钮case 3: bColor = m_BackColor; fColor = m_LockForeColor; break; //锁定的按钮

}

//绘制按钮背景

CBrush Brush;

Brush.CreateSolidBrush( m_BackColor ); //背景刷

pDC->SelectObject( &Brush );

CPen Pen;

Pen.CreatePen(PS_SOLID, 3, bColor );

pDC->SelectObject( &Pen );

pDC->RoundRect(&m_ButRect,CPoint(10,10)); //画圆角矩形

//绘制按钮按下时的边框

if( m_Style!=2 )

{

CRect Rect;

Rect.SetRect( m_ButRect.left+1, m_ButRect.top+1, m_ButRect.right, m_ButRect.bottom );

pDC->DrawEdge( &Rect, BDR_RAISEDINNER, BF_RECT ); //画边框}

//绘制按钮文字

pDC->SetTextColor( fColor ); //画文字

pDC->SetBkMode( TRANSPARENT );

pDC->DrawText( m_strText, &m_ButRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_END_ELLIPSIS);

//绘制拥有焦点按钮的虚线框

if( GetFocus()==this )

{

CRect Rect;

Rect.SetRect( m_ButRect.left+3, m_ButRect.top+2, m_ButRect.right-3, m_ButRect.bottom-2 );

pDC->DrawFocusRect( &Rect ); //画拥有焦点的虚线框

}

}

//变量m_Style 表征当前按钮状态,它的取值为:0-正常,1-当前,2-按下,3-锁定。不同状态下按钮的边框颜色和文字颜色有所不同。

//m_Style 的值在鼠标响应函数中进行修改。

//绘制工作主要利用CDC类的绘图函数完成,主要注意在m_Style 不同取值下表现出来的差别。

void MyButton::OnLButtonDown(UINT nFlags, CPoint point)

{

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

m_Style = 2;

Invalidate(); //重绘按钮

CButton::OnLButtonDown(nFlags, point);

}

//OnLButtonDown()函数是单击鼠标左键时的消息函数。这里只是重新绘制按钮,具体的单击响应应该在拥有按钮的对话框或视图中进行。

void MyButton::OnMouseMove(UINT nFlags, CPoint point)

{

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

if( !b_InRect || GetCapture()!=this ) //鼠标进入按钮

{

b_InRect = true; //设置进入标志

SetCapture(); //捕获鼠标

m_Style = 2; //m_Style = 1; //设置按钮状态

Invalidate(); //重绘按钮

}

else

{

if ( !m_ButRect.PtInRect(point) ) //鼠标离开按钮

{

b_InRect = false; //清除进入标志

ReleaseCapture(); //释放捕获的鼠标

m_Style = 1; //m_Style = 0; //设置按钮状态

Invalidate(); //重绘按钮

}

}

CButton::OnMouseMove(nFlags, point);

}

//onMouseMove()函数是鼠标移动消息函数,用于判定当前鼠标指针是否在按钮上。b_InRect 是个标志,为true表示鼠标指针进入了按钮区域,

//此时要捕获鼠标,让鼠标命令传送给按钮。当鼠标指针离开按钮时,要清除b_InRect标志,并且释放捕获的鼠标,让其它窗口可以接收鼠标命令。

//Invalidate()函数用于更新按钮,它会自动调用DrawItem()函数重新绘制按钮。

//设置条件的目的是仅在鼠标指针进入按钮和离开按钮时更新按钮,这样可以防止鼠标在按钮上移动时发生闪烁。

void MyButton::OnLButtonUp(UINT nFlags, CPoint point)

{

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

m_Style = 1;

Invalidate(); //重绘按钮

CButton::OnLButtonUp(nFlags, point);

}

//OnLButtonUp()函数是单击鼠标左键后弹起时的消息函数。这里也只是重绘按钮,这样能使按钮在按下和弹起时有所不同,使按钮看上去有动态效果。

//接口函数是用CMyButton类定义的按钮修改颜色、字体和按钮文字的接口,由以下函数组成:

//设置按钮文本

void MyButton::SetText(CString str)

{

m_strText = _T("");

SetWindowText(str);

}

//设置文本颜色

void MyButton::SetForeColor(COLORREF color)

{

m_ForeColor = color;

Invalidate();

}

//设置背景颜色

void MyButton::SetBkColor(COLORREF color)

{

m_BackColor = color;

Invalidate();

}

//设置字体(字体高度、字体名)

void MyButton::SetTextFont(int FontHight,LPCTSTR FontName)

{

if ( p_Font ) delete p_Font; //删除旧字体

p_Font = new CFont;

p_Font->CreatePointFont( FontHight, FontName ); //创建新字体

SetFont( p_Font ); //设置字体

}

///由于新字体由new 生成,必须显式回收,这项工作可以在CMyButton类的析构函数中进行:

/*CMyButton::~CMyButton()

{

if ( p_Font ) delete p_Font; //删除字体

}

*/

//这样一个可设置颜色、字体的按钮类就做好了。使用时,先在对话框中放置好按钮,再用ClassWizard 为按钮添加控制变量,

//并且将变量的类型设置为CMyButton。之后,可以用该变量调用接口函数设置按钮颜色和字体。

OK,自定义按钮完成。

6.3. 实现过程及代码:

现在可以对按钮,EDIT框等控件添加变量,文字描述麻烦,上图。

comm.cpp编写内容如下

#include "stdafx.h"

#include "commassist.h"

#include "commassistDlg.h"

#include "comm.h"

char ConvertHexChar(char ch);

HANDLE hCom; //串口句柄

CString strcomname; //串口名,如"COM1"

bool ComIsOK; //串口打开状态标识,为真表示已打开,否则未打开

//============自动寻找串口函数=================================

//函数功能:通过扫描注册表来找出当前所有物理串口

//输入参数:无

//返回类型:无

//说明:若搜索成功,则每搜到一个串口便发送消息通知主对话框,并将串口号以WPARAM传递

void FindComm()

{

//枚举当前系统中的串口

LONG result = 0;

HKEY key = NULL;

result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, //需要打开的主键的名称

"HARDW ARE\\DEVICEMAP\\SERIALCOMM", //需要打开的子键的名称,设备串口

0, //保留,必须设置为0

KEY_READ, //安全访问标记,也就是权限

&key); //得到的将要打开键的句柄,当不再需要句柄,

//必须调用RegCloseKey 关闭它if( result )

{

AfxMessageBox("无法获取串口,请确认是否安装并连接串口!");

return;

}

TCHAR portname[250]; //串口名

TCHAR data[250];

DWORD portnamelen = 0; //串口名长度

DWORD datalen = 0;

int index = 0;

while(1) //找完COM后跳出

{

portnamelen = 255;

datalen = 255;

result = RegEnumValue(key, //Long,一个已打开项的句柄,或者指定一个标准项名

index++, //Long,欲获取值的索引。注意第一个值的索引编号为零

portname, //String,用于装载位于指定索引处值名的一个缓冲区

&portnamelen, //Long,用于装载lpValueName缓冲区长度的一个变量。

//一旦返回,它会设为实际载入缓冲区的字符数量

NULL, //Long,未用;设为零

NULL, //Long,用于装载值的类型代码的变量

(LPBYTE)data, //Byte,用于装载值数据的一个缓冲区

&datalen); //Long,用于装载lpData缓冲区长度的一个变量。

//一旦返回,它会设为实际载入缓冲区的字符数量

if( result ) break;

//发送消息,WM_USER+1为自定义消息,即找到串口的,并将串口号"COMx"通过WPARAM参数传送给主对话框窗口

//::AfxGetMainWnd()->m_hWnd,获得主对话框句柄

//(WPARAM)(LPCTSTR)data,类型转换

::SendMessage(::AfxGetMainWnd()->m_hWnd,WM_FOUNDCOMM,(WPARAM)(LPCTS TR)data,0);

}

RegCloseKey(key); //调用RegCloseKey 关闭打开键的句柄

}

//============自动寻找串口函数结束==================

//==========串口打开函数===========================

//功能:打开串口,将已打开的串口句柄赋值给hCom,给出串口打开状态ComIsOK,完成串口状态设置

//输入参数:波特率,数据位,停止位,校验位

//返回类型:无

void OpenComm(int nBaud, int nData, int nStop, int nCal)

{

hCom = CreateFile ( strcomname, //串口号

GENERIC_READ | GENERIC_WRITE, //允许读或写

0, //独占方式

NULL,

OPEN_EXISTING, //打开而不是创建

FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//重叠方式,用于异步通信

NULL );

if(hCom == INV ALID_HANDLE_V ALUE)

{

AfxMessageBox("打开COM失败,串口不存在或已被占用!");

ComIsOK = false;

return;

}

ComIsOK = true;

SetCommMask(hCom, EV_TXEMPTY | EV_RXCHAR ); //设置事件掩码,暂时没用上

SetupComm(hCom,1024,1024); //设置输入缓冲区和输出缓冲区的大小都是1024 COMMTIMEOUTS TimeOuts;

//设定读超时

TimeOuts.ReadIntervalTimeout = MAXDWORD;

TimeOuts.ReadTotalTimeoutConstant = 0;

TimeOuts.ReadTotalTimeoutMultiplier = 0;

//设定写超时

TimeOuts.WriteTotalTimeoutConstant = 500;

TimeOuts.WriteTotalTimeoutMultiplier = 100;

if(SetCommTimeouts(hCom,&TimeOuts) == false)

{

CloseHandle(hCom);

ComIsOK = false;

return;

}

//串口属性配置

DCB dcb;

GetCommState(hCom,&dcb);

dcb.BaudRate=nBaud; //dcb.BaudRate=9600; //波特率为9600

dcb.ByteSize=nData; //dcb.ByteSize=8; //每个字节为8位

dcb.StopBits=nStop; //dcb.StopBits=ONESTOPBIT; //1位停止位

dcb.Parity=nCal; //dcb.Parity=NOPARITY; //无奇偶检验位

SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

if(SetCommState(hCom,&dcb) == false)

{

CloseHandle(hCom);

ComIsOK = false;

return;

}

return;

}

//==========串口打开函数结束=====================

//==========串口关闭控制函数=====================

void CloseComm()

{

CloseHandle(hCom);

hCom = NULL;

ComIsOK = false;

}

//==========串口关闭控制函数结束==================

//==========串口监听线程函数======================

UINT ThreadFunc(LPVOID pParam)

{

// CCommassistDlg* pdlg = (CCommassistDlg*)pParam; //定义指针指向主对话框COMSTAT ComStat;

DWORD dwErrorFlags;

while(ComIsOK)

{

DWORD dwBytesRead = 100;

ClearCommError(hCom,&dwErrorFlags,&ComStat);

dwBytesRead = min(dwBytesRead,(DWORD)ComStat.cbInQue);

if(!dwBytesRead)

{

Sleep(10);//continue;//使用continue时,打开串口后CPU占用率非常高}

else ::SendMessage(::AfxGetMainWnd()->m_hWnd,WM_READCOMM,1,0); //发送消息,已读到

}

return 0;

}

//==========串口监听线程函数结束================

//=================字符串转16进制显示==========

//字符串转16进制显示的函数

//传入参数Data为字符串

//Blank_allow为空格允许标志,为真则代表允许加入空格

//函数返回为CString的结果sResult

CString DisplayCString2Hex(CString Data, bool Blank_allow)

{

CString sResult;

CString sTemp;

int Data_Length;

Data_Length = Data.GetLength();

if (Data_Length == 0) return "";

char *pchar = new char[Data_Length]; //用了new分配内存空间,要记得释放strncpy(pchar,Data,Data_Length);

for(int i=0; i

{

sTemp.Format("%02X",pchar[i]);

if(Blank_allow)

{

if(i == Data_Length -1) sResult = sResult + sTemp; //去掉最后一个空格

else sResult = sResult + sTemp+" ";

}

else sResult = sResult + sTemp;

}

delete pchar; //释放内存空间

return sResult;

}

//===============函数结束============================

//=================16进制转字符串======================

//16进制转字符串,输入16进制的字符串,输出转换为16进制码

//传入参数str为字符串,判断输入是否按照16进制格式输入

int ConvertHexC2String(CString str, CByteArray &senddata)

{

//先判断输入字符串是否2个字符一组

int str_Length,iLength;

int hexdata, l_data;

char hstr,lstr;

char cTemp;

str_Length = str.GetLength();

iLength = 0;

senddata.SetSize(str_Length/2); //预先设置数组长度,不设置时,允许有错char *ppchar = new char[str_Length];

strncpy(ppchar,str,str_Length);

for(int i=0; i

{

cTemp = ppchar[i];

if(cTemp == ' ')

{

//iLength--;

i++;

continue; //如检测到空格则跳过,继续下一次循环

}

else

{

hstr = ppchar[i]; //取出字符作为16进制高位

i++;

lstr = ppchar[i]; //取出下一个字符作为16进制低位

if(lstr == ' ') //若取出的低位为空格,则不符合16进制2个一组的格式,终止循环

{

AfxMessageBox("请按照16进制每2个字符一组的方式输入",MB_ICONERROR);

break;

}

else

{

hexdata = ConvertHexChar(hstr); //高位转换为相应的0进制

l_data = ConvertHexChar(lstr); //低位转换为相应的10进制

if( (hexdata == -1) || (l_data == -1) )

{

AfxMessageBox("请按照16进制字符要求输入",MB_ICONERROR);

break;

}

else hexdata = hexdata*16 + l_data; //安装16进制方式高位低位合并

senddata[iLength] = (char)hexdata; //int整型数转换为char字符型,并存入数组senddata[]

i++; //进入下一次循环

iLength++; //成功转换一组(2个)字符,记录长度加1

}

}

}

senddata.SetSize(iLength);

delete ppchar;

return iLength;

}

经典的串口调试工具源代码(一)

经典的串口调试助手源代码(一) Dim OutputAscii As Boolean Dim InputString As String Dim OutputString As String '============================================================================== ======= ' 变量定义 '============================================================================== ======= Option Explicit ' 强制显式声明 Dim ComSwitch As Boolean ' 串口开关状态判断 Dim FileData As String ' 要发送的文件暂存Dim SendCount As Long ' 发送数据字节计数器 Dim ReceiveCount As Long ' 接收数据字节计数器Dim InputSignal As String ' 接收缓冲暂存 Dim OutputSignal As String ' 发送数据暂存 Dim DisplaySwitch As Boolean ' 显示开关 Dim ModeSend As Boolean ' 发送方式判断

Dim Savetime As Single ' 时间数据暂存延时用Dim SaveTextPath As String ' 保存文本路径 ' 网页超链接申明 Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Sub CloseCom() '关闭串口 On Error GoTo Err If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打 开,如果打开则先关闭 txtstatus.Text = "STATUS:COM Port Cloced" ' 串口状态显示 mnuconnect.Caption = "断开串口" cmdswitch.Caption = "打开串口" 'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭 的图标 ImgSwitchoff.Visible = True ImgSwitchon.Visible = False Err: End Sub Private Sub UpdateStatus() If MSComm.PortOpen Then StatusBar1.Panels(1).Text = "Connected" mnuautosend.Caption = "自动发送" mnuconnect.Caption = "断开串口" Else StatusBar1.Panels(1).Text = "断开串口" mnuautosend.Caption = "disautosend" mnuconnect.Caption = "打开串口" End If StatusBar1.Panels(2).Text = "COM" & https://www.doczj.com/doc/2312125720.html,mPort StatusBar1.Panels(3).Text = MSComm.Settings If (OutputAscii) Then StatusBar1.Panels(4) = "ASCII" Else StatusBar1.Panels(4) = "HEX" End If ' On Error GoTo Err If ChkAutoSend.Value = 1 Then ' 如果有效则,自动发送

串口调试助手设计思路与手册

(2016-11-21)本设计包含的函数模块有: 1.打开/关闭串口和设置串口参数 2.软件退出 3.获取串口参数 4.发送数据 5.接受数据 6.清空发送区 7.清空接收区 8.计数清零 9.暂停/开启接收数据 10.自动发送 11.发送周期设置 12.打开文件 13.保存数据 补充说明: 1.设置串口参数里面包括了1)获取串口可用串口。2)波特率下拉参数设置。3)校验位下 拉参数设置。4)数据位下拉参数设置。5)默认设置。6) 2.发送数据前先判断是否为十六进制,是否为自动发送。是十六进制发送则把数据先转为 十六进制格式并获取数据长度,再把数据转到发送缓冲区发送,否则ASCII码文本发送3.接收数据函数在串口运行时一直在判断是否有新数据,并根据不同的接收模式,加显不 同格式的数据 软件代码详细介绍: (74-92h)可用串口检测及下拉控件。 (96-109h)波特率下拉控件设置。 (113-121h)校验位下拉控件。 (125-131h)数据位下拉控件。 (135-141h)停止位下拉控件。 (145-155h)默认参数设置。 (159-162h)接收数据串口说明与启动。 (168-174h)关闭软件设置。 (176-180h)关闭窗口后先关闭线程再关闭进程。 (182-194h)定义串口各参数。 (197-281h)打开串口按钮回调函数,先判断是否有可用串口,没有则显示“无可用串口,无法打开”然后返回,有则继续判断当前是要打开串口还是关闭串口,若是需要打开串口则尝试设置串口参数并打开串口,打开串口失败会提示无法打开串口,打开串口成功则串口参数下拉控件变灰发送数据按钮点亮,判断自动发送控件如果被选中则打开串口后直接自动发送数据。如果之前判断按钮回调是关闭串口,则进行关闭串口并配置相关参数。 (282-347h)CRC16查表法校验函数。 (349-357h)发送数据按钮回调及自动发送按钮回调。 (358-369h)发送数据线程配置。 (371-510h)发送数据函数,先判断是否正在发送数据,如不在发送则设置当前正在发送状态,后继续判断是写序列号模式还是串口调试模式,串口调试模式时先定义发送缓冲区和

串口调试助手VC++6.0程序

串口调试助手源程序 及编程详细过程 作者:龚建伟 2001.6.20 可以任意转载,但必须注明作者和说明来自https://www.doczj.com/doc/2312125720.html,,不得作为商用 目次: 1.建立项目 2.在项目中插入MSComm控件 3.利用ClassWizard定义CMSComm类控制变量 4.在对话框中添加控件 5.添加串口事件消息处理函数OnComm() 6.打开和设置串口参数 7.发送数据 在众多网友的支持下,串口调试助手从2001年5月21日发布至今,短短一个月,在全国各地累计下载量近5000人次,在近200多个电子邮件中,20多人提供了使用测试意见,更有50多位朋友提出要串口调试助手的源代码,为了答谢谢朋友们的支持,公开推出我最初用VC控件MSComm编写串口通信程序的源代码,并写出详细的编程过程,姑且叫串口调试助手源程序V1.0或VC串口通讯源程序吧,我相信,如果你用VC编程,那么有了这个代码,就可以轻而易举地完成串口编程任务了。(也许本文过于详细,高手就不用看) 开始吧: 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,

Android 串口编程原理和实现方式附源码

提到串口编程,就不得不提到JNI,不得不提到JavaAPI中的文件描述符类:。下面我分别对JNI、以及串口的一些知识点和实现的源码进行分析说明。这里主要是参考了开源项目android-serialport-api。 串口编程需要了解的基本知识点:对于串口编程,我们只需对串口进行一系列的设置,然后打开串口,这些操作我们可以参考串口调试助手的源码进行学习。在Java中如果要实现串口的读写功能只需操作文件设备类:即可,其他的事都由驱动来完成不用多管!当然,你想了解,那就得看驱动代码了。这里并不打算对驱动进行说明,只初略阐述应用层的实现方式。 (一)JNI: 关于JNI的文章网上有很多,不再多做解释,想详细了解的朋友可以查看云中漫步的技术文章,写得很好,分析也很全面,那么在这篇拙文中我强调3点: 1、如何将编译好的SO文件打包到APK中?(方法很简单,直接在工程目录下新建文件夹libs/armeabi,将SO文件Copy到此目录即可) 2、命名要注意的地方?(在编译好的SO文件中,将文件重命名为:lib即可。其中是编译好后生成的文件) 3、MakeFile文件的编写(不用多说,可以直接参考package/apps目录下用到JNI的相关项目写法) 这是关键的代码: [cpp]view plaincopy

(二):

文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的或。这是API的描述,不太好理解,其实可简单的理解为:就是对一个文件进行读写。 (三)实现串口通信细节 1) 建工程:SerialDemo包名:org.winplus.serial,并在工程目录下新建jni和libs两个文件夹和一个org.winplus.serial.utils,如下图: 2) 新建一个类:SerialPortFinder,添加如下代码: [java]view plaincopy 1.package org.winplus.serial.utils; 2. 3.import java.io.File; 4.import java.io.; 5.import java.io.IOException; 6.import java.io.LineNumberReader; 7.import java.util.Iterator; 8.import java.util.Vector; 9. 10.import android.util.Log; 11. 12.public class SerialPortFinder { 13. 14.private static final String TAG = "SerialPort"; 15.

VBNET开发全功能串口调试助手

https://www.doczj.com/doc/2312125720.html, 开发全功能串口调试助手(含完整工程) 小记:https://www.doczj.com/doc/2312125720.html, 的串口通信用了很长时间了,也只用 Write 和Read 这样的方 法,以前都是用这种方式做上位机软件, 如此足矣。而前几天研究GSM 模块时对 串口返回的数据总是把握不好,参考开发板附送的例程,发现采用 SerialPort 的DataReceived 事件,可以实现中断触发式的数据接收。于是想到要自己做一 个串口调试助手,在实现基本功能的前提下增加一些方便自己调试的功能。 经过 断断续续的编写,就做成了下面这个小软件: 这个软件能够实现串口调试助手的全部功能,经过通信测试,数据接收性能 不亚于呼啸工作室的SComAssistant2.2,通过加大输入缓冲区,可以满足大量 数据接收。 https://www.doczj.com/doc/2312125720.html, 的串口通信主要使用 VS 自带的SerialPort 控件,而不是早先的 MSComm 更具有兼容性,这也是很久以前就放弃 VB 改用.NET 的直接原因。该控 件的主要方法、属性如下(该数据来自 VS 的MSD 帮助库):

想要通过串口收发数据,就需要对串口进行配置,包括设置端口、波特率、数据格式(如COM端口、9600bps、8位数据位、无校验位、1位停止位)等属性,之后通过Open方法打开串口。打开串口可通过手动指定,也可以使用GetPortNames 方法获取计算机中存在的串口。如果打开出错,则可能是串口不存在或者已被占用。下面是相应代码: Private SubSerialPortOpen() On Error GoToErr If SerialPort.IsOpen = True ThenSerialPort.Close() '避免重复打开端 口 SerialPort.Ope n() LabelCOMStatus.Text ="串口已打开" Exit Sub Err: MsgBox(‘ 串口不存在或已被占用!" + vbNewLine + ErrorToString()) ' 出现错误,显示错误信息 En dSub 如果想要在串口中支持中文字符收发,则可在初始化时设置串口控件的编码: SerialPort.E ncodi ng = System.Text.E ncodi ng.Default 发送数据通过Write方法来完成,由于串口调试助手需要支持文本和16进制, 需要加入转换代码: Private SubButtonSendData_Click( ByVal sender AsSystem.Object, ByVal e AsSystem.EventArgs) Handles ButtonSendData.Click On Error GoToErr

纯业余者用VC(MFC)编写串口调试助手(含VC6工程源文件)

纯业余者用VC(MFC)编写串口调试助手 1.序 毕业到现在,转眼就做射频开发10年了,一直从事直放站、干放等通信边缘行业,从低噪放、锁相源、选频、功放到整机,射频就那么点东西,而且越来越集成化,软件无线电是必然趋势。做射频从业面会越来越窄,我知道所有人都会说,当你成为专家的时候,一切就都不是问题,可有几个真正的专家,再者说,射频需要经验的积累,只有实际项目做的越多越广,经验也就积累得越多,并不是一朝一夕能达到的。 前不久突然觉得,我的射频模块控制要是也是自己来编程控制多好啊!那就得学单片机编程,学习上位机编程了,可我都不会啊,要不就先来整整上位机,windows方面的。大学唯一学的编程语言是C语言,可根本不能理解用C做什么,还都还给老师10多年了,这怎么办?从BASIC,C/C++,JAVA,PASCAL搜索了一圈,还是选C++吧,毕竟是C 语言发展而来,用VC环境,身边有可以请教的人。在网上转悠了很久,发现《windows 程序设计》是必看,《MFC Windows程序设计》是学MFC最经典的书籍。OMG,这些书啊,都是上千页的,白天都在上班,哪有时间看哦,只有先下载下来作为参考资料了。 扯远了啊。这也不行那也不行,怎么办呢?干脆硬着头皮上吧,找几个实例照搬,再修修改改加深理解吧。 第一个目标,自己编写个串口调试助手,掌握串口通信编程,这样上位机的编写就有希望了。 好了,目标定下来了。网上下载了个串口调试助手,确定基本功能: 1.自动寻找串口,并自动添加到下拉框中共选择; 2.有波特率、数据位、停止位、校验位的选择设置; 3.串口打开控制按钮; 4.发送、清除按钮; 5.接收是自动实现的; 6.有定时自动发送功能; 7.有传送文件功能; 8.有状态栏显示,指示串口状态,设置参数和发送接收显示。 下面就一步步实现,本人纯业余,只是记录下来这个学习过程,请勿拍砖。 开发平台Visual C++6.0英文版,电脑是i7-2670Q四核8G内存1G独显的笔记本,装的win7 64位旗舰版,因此VC6兼容不是太好,有些小毛病,不过不影响编写。

串口调试助手c开发

1.建立项目: 打开VC+ + 6.0,建立一个基于对话框的MFC应用程序SCommTest(与我 源代码一致,等会你会方便一点); 2.在项目中插入MSComm控件 选择Project菜单下Add To Project子菜单中的Componentsand Controls,选项,在弹出的对话框中双击Registered ActiveXControls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control,version6.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_ctrlCom m,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES()#include "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。 4 .在对话框中添加控件 向主对话框中添加两个编辑框,一个用于接收显示数据ID为 IDC_EDIT_RXDATA另一个用于输入发送数据,ID为IDC_EDIT_TXDAT A再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为 IDC_BUTTON_MANUALSEND别忘记了将接收编辑框的Prop erties->Styles 中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。

串口调试助手源代码

串口调试助手预源代码 using System; using System.Collections.Generic; using https://www.doczj.com/doc/2312125720.html,ponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.IO.Ports; using System.Threading; using DevExpress.XtraEditors; using System.Text.RegularExpressions; namespace WindowsFormsApplication3 { public partial class Form1 : XtraForm { SerialPort sp1 = new SerialPort(); int Flag = 0; int StateChanged = 0;

int StateChanged_Ascii = 1; int StateChanged_16 = 0; string Temp = null; string Temp_memoSend = null; private void memoSend_EditValueChanged(object sender, EventArgs e) { } public Form1() { InitializeComponent(); sp1.DataReceived += sp1_DataReceived; } private void Form1_Load(object sender, EventArgs e) { this.MaximizeBox = false; //检查是否有串口 string[] str = SerialPort.GetPortNames(); if (str == null) { MessageBox.Show("本机没有串口!", "error"); return; } //添加串口项目 foreach (string port in System.IO.Ports.SerialPort.GetPortNames()) { cbSerial.Properties.Items.Add(port); } //串口设置默认选择项 cbSerial.SelectedIndex = 0; Control.CheckForIllegalCrossThreadCalls = false; sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); //订阅委托 } private void comboBoxEdit1_SelectedIndexChanged(object sender, EventArgs

串口调试助手代码分析42

第5章串口调试助手代码分析 1、建立基于对话框的工程SCOMM 2、绘制界面,如下图: 接收区 串口组合框:IDC_COMBO_COMSELECT,m_Com 波特率组合框:IDC_COMBO_SPEED,m_Speed 停止位组合框:IDC_COMBO_STOPBITS,m_StopBits 数据位组合框:IDC_COMBO_DATABITS,m_DataBits 校验位组合框:IDC_COMBO_PARITY,m_Parity 十六进制显示(接收):IDC_CHECK_HEXRECIEVE,m_ctrlHexReceieve 接收编辑框:IDC_EDIT_RECIVE ,m_ReceiveData m_ctrlReceiveData Style:Vertical Scroll MultiLine 打开串口IDC_BUTTON_OPENPORT,m_ctrlOpenPort 串口开关标志图标IDC _STATIC_OPENOFF,m_ctrlIconOpenoff 数据文件保存路径IDC _EDIT_SA VEPATH,m_strCurPath 保存显示数据文件路径IDC _EDIT_SA VEPATH, m_ctrlSavePath 接收计数IDC_STATIC_RXCOUNT ,m_ctrlRXCOUNT 发送区 …。。。。。。。。。。。。。。 3、添加CSeraiPort类文件 将类文件SerialPort.h SerialPort.cpp 复制到工程所在文件夹中(选择改进

后的类),然后单击VC 6.0菜单Projrct -> Add to Projrct ->Files… ,再在打开的文件选择对话框中选择SerialPort.h 和SerialPort.cpp ,点击OK,就把类文件加入当前工程,并在SCOMMDlg.h 中加入头文件,#include "SerialPort.h",通过上述步骤就在当前工程中加入了CSeraiPort类。 4、完成串口消息处理函数OnCommunicatiom 在CserailPort 类中有多个串口事件可以响应。在一般串口编程中,只需要处理WM_COMM_RXCHAR消息就可以了,该类所有的消息均需要人工添加消息处理函数。我们将处理函数名定义为OnComm()。首先在SCOMMDlg.h 中添加串口字符接收消息WM_COMM_RXCHAR(串口接收缓冲区内有一个字符)响应函数的声明:如下图 然后,在SCOMMDlg.cpp文件中进行WM_COMM_RXCHAR消息映射: 如下图; 接着,在SCOMMDlg.cpp 文件中加入函数OnCommunication(WPARAM ch, LPARAM port)的实现,暂不添加代码。 LONG CSCOMMDlg::OnCommunication(WPARAM ch, LPARAM port) { return 0; } 以上步骤需要手工完成。 至此完成了程序的对话框模板,在工程中插入了串口操作类CserailPort类。5、添加串口初始化及关闭 程序中有两种方法大开串口,一是程序启动,调用OnInitDialog()函数,就可以打开串口,缺省的串口号为COM1,如果COM1不存在或占用,就会给出提示;另外,单击“打开串口”按钮也可以打开串口。 //在初始化中打开串口 BOOL CSCOMMDlg::OnInitDialog() { m_nBaud=9600;//波特率 m_nCom=1;//串口号 m_cParity='N';//奇偶校验

串口调试助手C++开发

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,为

C++课程设计 串口调试助手

目录 【内容摘要】 (2) 【关键词】 (2) 1 开发语言及开发平台简介 (3) 1.1 开发语言 (3) 1.1.1 C语言 (3) 1.1.2 C++语言 (3) 1.2 开发平台 (4) 1.2.1 Microsoft Visual C++ (4) 1.2.2 C++ Builder (5) 2 软件开发过程 (6) 2.1 开发所需要的控件 (6) 2.1.1 按钮控件 (6) 2.1.2 文本控件 (6) 2.1.3 串口控件 (6) 2.1.4 选择控件 (7) 2.2 数据发送设计 (7) 2.3 数据接收设计 (9) 3 软件使用说明 (11) 4 软件测试 (13) 4.1 辅助工具 (13) 4.2 发送测试 (13) 4.3 接收测试 (13) 5 总结 (15) 致谢 (16) 参考文献 (17) 附录主要程序 (18) 串口发送程序 (18) 串口接收程序 (19) 【Abstract】 (21) 【Key Words】 (21)

串口调试助手设计 专业:电子科学与技术学号:XXXXXXXXXXX 学生姓名:X X X 指导老师姓名:X X X 【内容摘要】串口调试助手是串口调试相关工具,网络上有很多串口调试助手,界面不同,功能各异,使用的开发语言和开发平台也不相同。有的使用C语言开发,有的使用C++语言开发,还有的即使用C语言也使用C++语言;开发平台有的使用Visual C++,有的使用C++ Builder等。本软件使用C语言和C++语言,开发平台使用C++Builder软件。该串口调试助手串口调试助手版支持常用的110 ~ 256000bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送数据或字符(包括中文),能发送文本文件(*.txt 文本),可以任意设定自动发送周期,并能将接收数据保存成文本文件(*.txt),是做项目开发调试串口的好工具。 【关键词】串口;C++;C++ Builder;控件;测试;

VB串口调试助手源代码

VB串口调试助手源代码 Dim OutputAscii As Boolean Dim InputString As String Dim OutputString As String '============================================================================== ======= ' 变量定义 '============================================================================== ======= Option Explicit ’强制显式声明 Dim ComSwitch As Boolean ’串口开关状态判断 Dim FileData As String ’要发送的文件暂存 Dim SendCount As Long ’发送数据字节计数器 Dim ReceiveCount As Long ’接收数据字节计数器 Dim InputSignal As String ’接收缓冲暂存 Dim OutputSignal As String ’发送数据暂存 Dim DisplaySwitch As Boolean ’显示开关 Dim ModeSend As Boolean ’发送方式判断 Dim Savetime As Single ’时间数据暂存延时用 Dim SaveTextPath As String ’保存文本路径 ' 网页超链接申明 Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Sub CloseCom() '关闭串口 On Error GoTo Err If MSComm.PortOpen = True Then MSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭

串口调试助手源程序编程详细过程

目录: 1.建立项目 2.在项目中插入MSComm控件 3.利用ClassWizard定义CMSComm类控制变量 4.在对话框中添加控件 5.添加串口事件消息处理函数OnComm() 6.打开和设置串口参数 7.发送数据 8.发送十六进制字符 9.在接收框中以十六进制显示 10.如何设置自动发送 11.什么是VARIANT数据类型?如何使用VARIANT数据类型? 在众多网友的支持下,串口调试助手从2001年5月21日发布至今,短短一个月,在全国各地累计下载量近5000人次,在近200多个电子邮件中,20多人提供了使用测试意见,更有50多位朋友提出要串口调试助手的源代码,为了答谢谢朋友们的支持,公开推出我最初用VC控件MSComm编写串口通信程序的源代码,并写出详细的编程过程,姑且叫串口调试助手源程序V1.0或VC串口通讯源程序吧,我相信,如果你用VC编程,那么有了这个代码,就可以轻而易举地完成串口编程任务了。(也许本文过于详细,高手就不用看) 开始吧: 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就可以了),

经典的串口调试助手源代码.

Dim OutputAscii As Boolean Dim InputString As String Dim OutputString As String '=========================================================== =================== ======= ' 变量定义 '=========================================================== =================== ======= Option Explicit ' 强制显式声明 Dim ComSwitch As Boolean ' 串口开关状态判断

Dim FileData As String ' 要发送的文件暂存 Dim SendCount As Long ' 发送数据字节计数器 Dim ReceiveCount As Long ' 接收数据字节计数器 Dim InputSignal As String ' 接收缓冲暂存 Dim OutputSignal As String ' 发送数据暂存 Dim DisplaySwitch As Boolean ' 显示开关 Dim ModeSend As Boolean ' 发送方式判断 Dim Savetime As Single ' 时间数据暂存延时用 Dim SaveTextPath As String ' 保存文本路径 ' 网页超链接申明 Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long As Long Private Sub CloseCom( ' 关闭串口 On Error GoTo Err If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭 txtstatus.Text = "STATUS:COM Port Cloced" ' 串口状态显示 mnuconnect.Caption = "断开串口 "

串口调试助手使用说明和技术总结

串口调试助手的技术报告 1.软件简介 串口调试助手是在Windows平台下开发的,工具是VC++6.0。串口调试助手版支持常用的300 ~ 115200bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送数据或字符(包括中文),能发送文本文件,可以任意设定自动发送周期,并能将接收数据保存成文本文件。是工程师调试串口的好助手工具。 2.软件特点 (1) 支持XP /Vista/Win7系统; (2) 绿色软件,不需安装。运行解压软件,将压缩包解压到指定目录即可。 卸载时只需将程序目录删除; (3) 支持常用的300 ~ 115200bps波特率; (4) 端口范围是COM1-COM4; (5) 能设置校验、数据位和停止位; (6) 能以字符或十六进制收发数据,支持中文字符的收发; (7) 支持文件数据的发送; (8) 数据发送端允许设置发送周期,自动发送数据; (9) 支持键盘输入,将键盘数据发送到串口; (10)支持自动清空(若设置了“自动清空”,则达到50行后,自动清空接收编 辑框中显示的数据)接收窗口数据; (11)如果没有“自动清空”,数据行达到400后,也自动清空,因为数据过 多,影响接收速度,显示是最费CPU时间的操作 (12)能够保存接收到的数据,保存地址默认的是C:\COMDATA; (13)设置了“停止显示”和“继续显示”按钮,可以方便的照出要使用的信 息; (14)图钉按钮功能使程序能浮在最上层。 3.软件界面

图1串口调试助手V3.0界面 4.软件的设计流程 本软件使用的是Windows API 串口编程,其编程基本步骤如下: (1)打开串口; (2)建立串口通信事件; (3)初始化串口; (4)建立数据线程; (5)读写数据; (6)结束时关闭串口。 5.遇到的问题与相应的解决方案 (1)串口打开或者关闭有明显的提示 (2)界面的大小设置问题,起初只有最小化按钮,按要求加上最大化以及界面要按照一定的规则能进行缩放 (3)能发送和接收汉字 (4)串口接收显示的数据丢失原因:接收显示是影响程序性能的一个大问题,当接收到大量数据时,串口通信助手响应不太及时,这个可能与调用类中的使用机制有关,但显示也没能很好地处理,不过在实际的传输过程中是没有丢失数据的。

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

串口调试助手VC源程序 及编程详细过程 作者:龚建伟 可以任意转载,注明作者和说明来自◆龚建伟技术主页◆ 目次: 1.建立项目 2.在项目中插入MSComm控件 3.利用ClassWizard定义CMSComm类控制变量 4.在对话框中添加控件 5.添加串口事件消息处理函数OnComm() 6.打开和设置串口参数 7.发送数据 如果你还没有下载源程序,又对本文有兴趣,请立即下载 在众多网友的支持下,串口调试助手从2001年5月21日发布至今,短短一个月,在全国各地累计下载量近5000人次,在近200多个电子邮件中,20多人提供了使用测试意见,更有50多位朋友提出要串口调试助手的源代码,为了答谢谢朋友们的支持,公开推出我最初用VC控件MSComm编写串口通信程序的源代码,并写出详细的编程过程,姑且叫串口调试助手源程序V1.0或VC串口通讯源程序吧,我相信,如果你用VC编程,那么有了这个代码,就可以轻而易举地完成串口编程任务了。(也许本文过于详细,高手就不用看) 开始吧: 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,这时你可以看一看,在对话框头

基于Modbus RTU 的串口调试软件的实现

基于Modbus RTU的串口调试软件的实现 文中介绍了Modbus RTU通讯协议的特点,阐述了该协议在VC2005编程环境下申口调试软件的具体实现方法。并编制了相关的程序,该程序采用了模块化思想,结构清晰,操作简便,实现了良好的ModbusRTU报文储存及管理机制,使用多线程兼顾界面显示和数据通讯,完全兼容ModbuaRTU通讯协议,可用于自定义功能码的Modbus兼容设备的调试,克服了普通Modbus调试软件仅能用于Modbus标准功能码调试的不足。实践证明,该程序编制思想合理、运行稳定、操作简便易行,为工业自动化中Modbus设备的调试带来方便。 一、ModbusRTU通信协议简介 Modbus通信协议是Modieon公司开发的一种通信协议,它采用主从问答方式工作,是一种真正开放、标准的、免收许可费的网络通信协议。广泛用于自动化控制器和测控仪表,现已成为一种公认的通用工业标准。如今Modbus协议已经成为我国工业自动化网络协议规范的国家标准之一。不同厂商生产的控制设备可以籍此连成工业网络。进行集中监控。该协议有2种传输模式,即RTU模式和ASCII模式。对于ASCII模式,一个信息帧中的每8位的字节作为2个ASCII字符传输;而对于RTU模式。信息帧中的8位数据作为2个4位16进制字符,相对于ASCII模式,RTU模式表达相同的信息需要较少的位数,且在相同通信速率下具有更大的数据流量。因此通常情况下,一般工业智能仪表仪器都是采用RTU 模式的Modbus规约。 二、ModbusRTU传输过程 信息传输为异步方式,并以字节为单位。在主站和从站之间传递的通讯报文的信息帧格式如表1所示。 ModbusRTU采用主从方式,若主机设备发送一个信息,则可从一台从机设备返回一个响应,类似的,当一台从机设备接受信息时,它就组织一个从机设备的响应信息,并返回至原发送信息的主机设备。 当通讯命令由主机发送至从机时,符合相应地址码的从机接收通讯命令,并根据功能码及相关要求读取信息,如果CRC校验无误,则执行相应的任务,然后把执行结果返送给主机。 表1 Modbus RTU信息帧格式 Modbus RTU的查询响应周期如图1所示。

相关主题
文本预览
相关文档 最新文档