串口调试助手源程序及讲解
经典串口调试助手源程序及串口通信设置
经典串口调试助手源程序及串口通信设置标题:串口调试助手之经典源程序及通信设置导言:串口调试助手是一种用于串口通信的调试工具,广泛应用于工业控制、测试等领域。
本文将介绍一种基于Windows平台的经典串口调试助手源程序及相关的串口通信设置,旨在帮助读者更好地了解该工具的使用和配置方法。
一、经典串口调试助手源程序1.开发平台:本程序采用C++ Builder 6.0开发。
2.功能概述:(1)串口设置包括设置串口波特率、数据位、校验位、停止位、流控、超时等参数。
(2)发送数据支持以字符串或Hex方式发送数据。
(3)接收数据实时显示串口接收到的数据,并支持数据格式设置。
(4)自动发送数据支持单次或循环发送,可设置发送时间间隔和发送次数。
(5)保存数据支持将接收到的数据保存为文本或二进制文件。
3.源程序结构本程序主要由以下几个模块组成:(1)Main Form:主窗体,包含图形界面显示和基本操作控件。
(2)Serial:串口类,负责串口相关操作,例如打开、关闭、设置参数、发送、接收等。
(3)SaveToFile:文件保存类,负责数据保存到文件中。
(4)Config:配置类,负责程序设置和读取。
(5)Hex:十六进制转换类,用于将字符串转换为Hex格式。
二、串口通信设置1.串口连接串口连接有两种方式:一种是通过RS232串口连接,需要将串口线插入串口,然后将串口线连接到目标设备;另一种是通过USB转串口连接,需要将USB转串口转接器插入计算机USB接口,然后将串口线连接到USB转串口转接器。
2.串口参数设置在使用串口调试助手前,必须先设置串口参数。
打开主窗体后,点击“串口设置”按钮,在弹出的窗口中设置串口的参数,包括波特率、数据位、校验位、停止位、流控和超时等参数。
其中,波特率是指通信时的数据传输速率,常用的有9600、19200、38400、57600、115200等。
数据位是指每次传输的数据位数,常用的有8位、7位、6位等。
51单片机入门零基础1.3如何使用串口调试助手
1.3如何使用串口调试助手
串口调试助手,顾名思义是用来仿真串口的,到底如何使用呢,我们先打开串口调试助手软件,图标如图0-1所示。
图0-1 串口调试助手图标
打开后的界面如图0-2所示。
图0-2 串口助手打开界面
接下来我们设置下配置,首先将COM口设置为所连接的COM口,如何看COM口请参见错误!未找到引用源。
,这里不再讲解。
然后将波特率选择9600,最后将Receive As HEX勾选取出,如图0-3所示。
图0-3 串口助手的配置
将串口收发的程序下载到单片机中,过程上一节有详细介绍。
打开串口助手,按上述配置完成后,点击Open,我们在发送栏里输入“abab”,点击Send,在接收栏里出现“abab”现象如图0-4所示。
图0-4 串口助手之串口收发现象
这个软件用于检测串口程序,检测结束直接点击Close并关闭即可。
经典的串口调试助手源代码
/article/446.html/hinzn/blog/item/4e81b4459b390a2ecffca3bb.html/modeng_2005/blog/static/265611200981142011329//mod eng_2005/blog/static/265611200981142011329/Dim OutputAscii As BooleanDim InputString As StringDim 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 LongPrivate Sub CloseCom() '关闭串口On Error GoTo ErrIf 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 = TrueImgSwitchon.Visible = FalseErr:End SubPrivate Sub UpdateStatus()If MSComm.PortOpen ThenStatusBar1.Panels(1).Text = "Connected"mnuautosend.Caption = "自动发送"mnuconnect.Caption = "断开串口"ElseStatusBar1.Panels(1).Text = "断开串口"mnuautosend.Caption = "disautosend"mnuconnect.Caption = "打开串口"End IfStatusBar1.Panels(2).Text = "COM" & mPortStatusBar1.Panels(3).Text = MSComm.SettingsIf (OutputAscii) ThenStatusBar1.Panels(4) = "ASCII"ElseStatusBar1.Panels(4) = "HEX"End If'On Error GoT o ErrIf ChkAutoSend.Value = 1 Then ' 如果有效则,自动发送If MSComm.PortOpen = True Then ' 串口状态判断mnuautosend.Caption = "Dis&autosend"TmrAutoSend.Interval = Val(TxtAutoSendTime) ' 设置自动发送时间TmrAutoSend.Enabled = True ' 打开自动发送定时器Elsemnuautosend.Caption = "autosend"ChkAutoSend.Value = 0 ' 串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ' 如果无效,不发送mnuautosend.Caption = "autosend"TmrAutoSend.Enabled = False ' 关闭自动发送定时器End IfErr:End SubPrivate Sub CmdSendFile_Click() '发送文件On Error GoTo ErrIf MSComm.PortOpen = True Then ' 如果串口打开了,则可以发送数据If FileData = "" Then ' 判断发送数据是否为空MsgBox "发送的文件为空", 16, "串口调试助手" ' 发送数据为空则提示ElseIf ChkHexReceive.Value = 1 Then ' 如果按十六进制接收时,按二进制发送,否则按文本发送MSComm.InputMode = comInputModeBinary ' 二进制发送ElseMSComm.InputMode = comInputModeText ' 文本发送End IfMSComm.Output = Trim(FileData) ' 发送数据ModeSend = True ' 设置文本发送方式End IfElseMsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfErr:End SubPrivate Sub Comm_initial(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer, StopBit As Integer)On Error GoTo ErrorTrap ' 错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭mPort = Port ' 设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.InBufferSize = 1024 ' 设置接收缓冲区为1024字节MSComm.OutBufferSize = 4096 ' 设置发送缓冲区为4096字节MSComm.InBufferCount = 0 ' 清空输入缓冲区MSComm.OutBufferCount = 0 ' 清空输出缓冲区MSComm.SThreshold = 1 ' 发送缓冲区空触发发送事件MSComm.RThreshold = 1 ' 每X个字符到接收缓冲区引起触发接收事件MSComm.OutBufferCount = 0 ' 清空发送缓冲区MSComm.InBufferCount = 0 ' 滑空接收缓冲MSComm.PortOpen = True ' 打开串口If MSComm.PortOpen = True Thentxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," & Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsetxtstatus.Text = "STATUS:COM Port Cloced" ' 串口没打开时,提示串口关闭状态End IfExit SubErrorTrap: ' 错误处理Select Case Err.NumberCase comPortAlreadyOpen ' 如果串口已经打开,则提示MsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComCase ElseMsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComEnd SelectErr.ClearEnd SubPrivate Sub Comm_reSet(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer,StopBit As Integer)On Error GoTo ErrorHint ' 错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭mPort = Port ' 设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.PortOpen = True ' 打开串口If MSComm.PortOpen = True Thencmdswitch.Caption = "关闭串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\kai.jpg") ' 显示串口已经打开的图标ImgSwitchoff.Visible = Falsemnuconnect.Caption = "disconnect"ImgSwitchon.Visible = Truetxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," & Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsecmdswitch.Caption = "打开串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭的图标ImgSwitchon.Visible = FalseImgSwitchoff.Visible = Truetxtstatus.Text = "STATUS:COM Port Cloced"End IfExit SubErrorHint: ' 错误处理Select Case Err.NumberCase comPortAlreadyOpen ' 如果串口已经打开,则提示MsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ' 调用关闭串口函数Case ElseMsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ' 调用关闭串口函数End SelectErr.Clear ' 清除Err 对象的属性End SubPrivate Sub Command1_Click()End SubPrivate Sub cbobaudrate_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbocom_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbodatabit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cboparitybit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbostopbit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub chkautosend_Click()On Error GoTo ErrIf ChkAutoSend.Value = 1 Then ' 如果有效则,自动发送If MSComm.PortOpen = True Then ' 串口状态判断mnuautosend.Caption = "取消自动发送"TmrAutoSend.Interval = Val(TxtAutoSendTime) ' 设置自动发送时间TmrAutoSend.Enabled = True ' 打开自动发送定时器ElseChkAutoSend.Value = 0 ' 串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ' 如果无效,不发送mnuautosend.Caption = "自动发送数据"TmrAutoSend.Enabled = False ' 关闭自动发送定时器End IfErr:End SubPrivate Sub cmdamend_Click()Dim spShell As Object ' 定义存放引用对象的变量Dim spFolder As Object ' 定义存放引用对象的变量Dim spFolderItem As Object ' 定义存放引用对象的变量Dim spPath As String ' 定义存放的变量On Error GoTo Err ' 错误处理,防止取消打开文件夹时报错Const WINDOW_HANDLE = 0Const NO_OPTIONS = 0Set spShell = CreateObject("Shell.Application")Set spFolder = spShell.BrowseForFolder(WINDOW_HANDLE, "选择目录:", NO_OPTIONS, "C:\Scripts")Set spFolderItem = spFolder.SelfspPath = spFolderItem.PathspPath = Replace(spPath, "\", "\") ' Replace函数的返回值是一个字符串txtsavepath.Text = spPath ' 把文件夹路径显示在标签上SaveTextPath = txtsavepath.Text ' 路径暂存Err:End SubPrivate Sub CmdClearCounter_Click()On Error GoTo ErrSendCount = 0 ' 发送计数器清零ReceiveCount = 0 ' 接收计数器清零txtRXcount.Text = "RX:" & 0 ' 接收计数txtTXcount.Text = "TX:" & 0 ' 发送计数Err:End SubPrivate Sub cmdclearrecieve_Click()TxtReceive.Text = ""End SubPrivate Sub cmdclearsend_Click()txtsend.Text = ""End SubPrivate Sub CmdHelp_Click()FrmHelp.ShowEnd SubPrivate Sub CmdQuit_Click()If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭Unload Me ' 卸载窗体,并退出程序EndEnd SubPrivate Sub cmdsavedisp_Click()On Error GoTo Err ' 错误处理SaveTextPath = txtsavepath ' 路径暂存Open txtsavepath & "\1.txt" For Output As #1 ' 打开文件' 不存在的话会创建文件,如已存在会覆盖' output 改为append 为追加' 改为input 则只读Print #1, Year(Date) & "年" & Month(Date) & "月" & Day(Date) & _"日" & Hour(Time) & "时" & Minute(Time) & "分" & Second(Time) & _"秒" & vbCrLf & TxtReceive.Text + vbCrLf ' 把接收区的文本保存文本前加上保存时间(0000年00月00日00时00分00秒)' vbcrlf 为回车换行Close #1 ' 关闭文件txtsavepath = "OK,1.txt Save" ' 提示保存成功cmdsavedisp.Enabled = FalseSavetime = Timer ' 记下开始的时间While Timer < Savetime + 5 ' 循环等待5 - 要延时的时间DoEvents ' 转让控制权,以便让操作系统处理其它的事件。
串口调试助手通信调试原理图PCB及使用手册
串口调试助手通信调试原理图PCB及使用手册【简要说明】一、尺寸:长170mmX宽72mmX高18mm二、主要芯片:单片机,MAX485,MAX232三、工作电压:6V至40V,功耗小于1W四、特点:1、具有稳压电路,输入电压广,具有电源指示灯。
2、具有485通信和232通信及TTL通信。
3、具有数码管数据显示,蜂鸣器提示音4、波特率可调分别是 2400 4800 9600 192005、采用大按键,机械寿命长。
6、单片机编程,提供源代码7、可发送20组数据8、具有系统复位按键9、端子采用螺旋压接端子10、工作温度-40度至 +70度11、工作湿度 40% ~ 80%RH12、板子静态功耗小于1W13、具有续流保护14、具有电磁抗干扰能力15、板子稳定工作可靠16、板子可安装在DIN导轨上面使用说明:【标注说明】【功能描述】【原理图】【PCB图】【元件清单】【应用举例】【应用举例2】例如:将下面一组数据通过串口发送给电脑。
波特率是9600,电脑用串口助手显示出来。
数据是:A0 B2 CC FF EF D8 90 88第一步:板子供电,串口连接电脑,查看串口号。
如下图:我的电脑--属性--硬件---设备管理器---端口设备。
下图:第三步:从发送板,按下下面一组数据,数据是:A0 B2 CC FF EF D8 90 88数据按完之后,按发送键“S2”,如果数据输入错误,可以按”S1”按键清零,重新输入。
如果要发送多遍,重复按“S2”按键。
单遍发送如下图。
【源代码程序】/*一次最多发送20组数据,大于这个数据就不再发送*/#include <STC12C5A60S2.H>#define uchar unsigned char#define uint unsigned int/**************************************************************/unsigned char T0RH = 0; //T0重载值的高字节unsigned char T0RL = 0; //T0重载值的低字节extern void UartDriver(); //串口驱动函数,监测数据帧的接收,调度功能函数,需在主循环中调用extern void ConfigUART(unsigned int baud); //串口配置函数,baud-通信波特率extern void ConfigUART1(unsigned int baud1); //串口配置函数,baud-通信波特率extern void UartRxMonitor(unsigned char ms); //串口接收监控,由空闲时间判定帧结束,需在定时中断中调用,ms-定时间隔extern void SendString(char *s) ;extern void UartWrite(unsigned char *buf, unsigned char len); //串口数据写入,即串口发送函数,buf-待发送数据的指针,len-指定的发送长度extern void fengming();uchar zh[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar jieshou[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uchar jj = 0;/*****************************************************************/sbit out0 = P2^0;sbit out1 = P2^1;sbit out2 = P2^2;sbit out3 = P2^3;sbit in0 = P2^4;sbit in1 = P2^5;sbit in2 = P2^6;sbit in3 = P2^7;sbit smgk = P3^6;sbit boma1 = P1^1;sbit boma2 = P1^0;bit d1 = 1;bit d2 = 1;sbit in4 = P1^6;sbit in5 = P1^5;uchar code xianshi [] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};uchar dangqianzhuangtai[4][4] = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};void t0 () interrupt 1{uchar i;static uchar lie = 0;static uchar sao[2] = {1,1};static uchar saomiaobaocun [4][4] = {{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};TH0 = 0xfc;TL0 = 0x67;UartRxMonitor(1); //串口接收监控sao[0] = (sao[0]<<1) |in4;sao[1] = (sao[1]<<1) |in5;saomiaobaocun [lie][0] = (saomiaobaocun [lie][0]<<1) | in0; saomiaobaocun [lie][1] = (saomiaobaocun [lie][1]<<1) | in1; saomiaobaocun [lie][2] = (saomiaobaocun [lie][2]<<1) | in2; saomiaobaocun [lie][3] = (saomiaobaocun [lie][3]<<1) | in3;if(sao[0] == 0x00){d1 = 0;}else if(sao[0] == 0xff){d1 = 1;}if(sao[1] == 0x00){d2 = 0;}else if(sao[1] == 0xff){d2 = 1;}for (i=0;i<4;i++){if ((saomiaobaocun [lie][i] & 0x0f) == 0x00){dangqianzhuangtai[lie][i] = 0;}else if ((saomiaobaocun [lie][i] & 0x0f) == 0x0f){dangqianzhuangtai[lie][i] = 1;}}lie++;lie = lie & 0x03;switch (lie){case 0 : out1 = 1; out2 = 1; out3 = 1; out0 = 0; break;case 1 : out0 = 1; out2 = 1; out3 = 1; out1 = 0; break;case 2 : out0 = 1; out1 = 1; out3 = 1; out2 = 0; break;case 3 : out0 = 1; out1 = 1; out2 = 1; out3 = 0; break;}}void main (){uchar i,j;bit q1 = 1;bit q2 = 1;uchar qianyicizhuangtai[4][4] = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};smgk = 0;TMOD = 0x01;TH0 = 0xfc;TL0 = 0x67;TR0 = 1;EA = 1;ET0 = 1;P0 = xianshi[16];// ConfigUART(9600); //配置波特率为9600while (1){UartDriver(); //调用串口驱动if((boma1 == 0)&&(boma2 != 0)){ConfigUART(2400); //配置波特率为1200}if((boma2 == 0)&&(boma1 != 0)){ConfigUART(4800); //配置波特率为4800}if((boma1 == 0)&&(boma2 == 0)){ConfigUART(9600); //配置波特率为9600}if((boma1 != 0)&&(boma2 != 0)){ConfigUART1(19200); //配置波特率为19200 }if(d1 != q1){q1 = d1;if(d1 == 0){if((jj != 0)&&(jj <= 2)){zh[0] = jieshou[0] | jieshou[1];UartWrite(zh, 1);fengming();}if((jj > 2)&&(jj <= 4)){zh[0] = jieshou[0] | jieshou[1];zh[1] = jieshou[2] | jieshou[3];UartWrite(zh, 2);fengming();}if((jj > 4)&&(jj <= 6)){zh[0] = jieshou[0] | jieshou[1];zh[1] = jieshou[2] | jieshou[3];zh[2] = jieshou[4] | jieshou[5];UartWrite(zh, 3);fengming();}if((jj > 6)&&(jj <= 8)){zh[0] = jieshou[0] | jieshou[1];zh[1] = jieshou[2] | jieshou[3];zh[2] = jieshou[4] | jieshou[5];zh[3] = jieshou[6] | jieshou[7];UartWrite(zh, 4);fengming();}if((jj > 8)&&(jj <= 10)){zh[0] = jieshou[0] | jieshou[1];zh[1] = jieshou[2] | jieshou[3];zh[2] = jieshou[4] | jieshou[5];zh[3] = jieshou[6] | jieshou[7];zh[4] = jieshou[8] | jieshou[9];UartWrite(zh, 5);fengming();}if((jj > 10)&&(jj <= 12)){zh[0] = jieshou[0] | jieshou[1];zh[1] = jieshou[2] | jieshou[3];zh[2] = jieshou[4] | jieshou[5];zh[3] = jieshou[6] | jieshou[7];zh[4] = jieshou[8] | jieshou[9];zh[5] = jieshou[10] | jieshou[11];UartWrite(zh, 6);fengming();}if((jj > 12)&&(jj <= 14)){zh[0] = jieshou[0] | jieshou[1];zh[1] = jieshou[2] | jieshou[3];zh[2] = jieshou[4] | jieshou[5];zh[3] = jieshou[6] | jieshou[7];zh[4] = jieshou[8] | jieshou[9];zh[5] = jieshou[10] | jieshou[11];zh[6] = jieshou[12] | jieshou[13];UartWrite(zh, 7);fengming();}if((jj > 14)&&(jj <= 16)){zh[0] = jieshou[0] | jieshou[1];zh[1] = jieshou[2] | jieshou[3];zh[2] = jieshou[4] | jieshou[5];zh[3] = jieshou[6] | jieshou[7];zh[4] = jieshou[8] | jieshou[9];zh[5] = jieshou[10] | jieshou[11];zh[6] = jieshou[12] | jieshou[13];zh[7] = jieshou[14] | jieshou[15];UartWrite(zh, 8);fengming();}if((jj > 16)&&(jj <= 18)){zh[0] = jieshou[0] | jieshou[1];zh[1] = jieshou[2] | jieshou[3];zh[2] = jieshou[4] | jieshou[5];zh[3] = jieshou[6] | jieshou[7];zh[4] = jieshou[8] | jieshou[9];zh[5] = jieshou[10] | jieshou[11];zh[6] = jieshou[12] | jieshou[13];zh[7] = jieshou[14] | jieshou[15];zh[8] = jieshou[16] | jieshou[17];UartWrite(zh, 9);fengming();}if((jj > 18)&&(jj <= 20)){zh[0] = jieshou[0] | jieshou[1];zh[1] = jieshou[2] | jieshou[3];zh[2] = jieshou[4] | jieshou[5];zh[3] = jieshou[6] | jieshou[7];zh[4] = jieshou[8] | jieshou[9];zh[5] = jieshou[10] | jieshou[11];zh[6] = jieshou[12] | jieshou[13];zh[7] = jieshou[14] | jieshou[15];zh[8] = jieshou[16] | jieshou[17];zh[9] = jieshou[18] | jieshou[19];UartWrite(zh, 10);fengming();}}}if(d2 != q2){q2 = d2;if(d2 == 0){jj = 0;jieshou[0] = 0x00;jieshou[1] = 0x00;jieshou[2] = 0x00;jieshou[3] = 0x00;jieshou[4] = 0x00;jieshou[5] = 0x00;jieshou[6] = 0x00;jieshou[7] = 0x00;jieshou[8] = 0x00;jieshou[9] = 0x00;P0 = xianshi[16];fengming();}}for (i=0;i<4;i++){for (j=0;j<4;j++){if(dangqianzhuangtai[i][j] != qianyicizhuangtai[i][j] ){qianyicizhuangtai[i][j] = dangqianzhuangtai[i][j];if(qianyicizhuangtai[i][j] != 0){jj++;if((i*4+j) < 9){P0 = xianshi[i*4+j+1];}if((i*4+j) == 9){P0 = xianshi[0];}if((i*4+j) > 9){P0 = xianshi[i*4+j];}fengming();/******************1组**************************/if(jj == 1){//jieshou[0] = i*4+j;//jieshou[0] = jieshou[0] << 4;if((i*4+j) < 9){jieshou[0] = i*4+j+1;if((i*4+j) == 9){jieshou[0] = 0;}if((i*4+j) > 9){jieshou[0] = i*4+j;}jieshou[0] = jieshou[0] << 4;}if(jj == 2){//jieshou[1] = i*4+j;if((i*4+j) < 9){jieshou[1] = i*4+j+1;}if((i*4+j) == 9){jieshou[1] = 0;}if((i*4+j) > 9){jieshou[1] = i*4+j;}}/******************2组**************************/ if(jj == 3){//jieshou[2] = i*4+j;if((i*4+j) < 9){jieshou[2] = i*4+j+1;}if((i*4+j) == 9){jieshou[2] = 0;}if((i*4+j) > 9){jieshou[2] = i*4+j;jieshou[2] = jieshou[2] << 4;}if(jj == 4){//jieshou[3] = i*4+j;if((i*4+j) < 9){jieshou[3] = i*4+j+1;}if((i*4+j) == 9){jieshou[3] = 0;}if((i*4+j) > 9){jieshou[3] = i*4+j;}}/******************3组**************************/ if(jj == 5){//jieshou[4] = i*4+j;if((i*4+j) < 9){jieshou[4] = i*4+j+1;}if((i*4+j) == 9){jieshou[4] = 0;}if((i*4+j) > 9){jieshou[4] = i*4+j;}jieshou[4] = jieshou[4] << 4;}if(jj == 6){//jieshou[5] = i*4+j;if((i*4+j) < 9){jieshou[5] = i*4+j+1;}if((i*4+j) == 9){jieshou[5] = 0;}if((i*4+j) > 9){jieshou[5] = i*4+j;}}/******************4组**************************/ if(jj == 7){//jieshou[6] = i*4+j;if((i*4+j) < 9){jieshou[6] = i*4+j+1;}if((i*4+j) == 9){jieshou[6] = 0;}if((i*4+j) > 9){jieshou[6] = i*4+j;}jieshou[6] = jieshou[6] << 4;}if(jj == 8){//jieshou[7] = i*4+j;if((i*4+j) < 9){jieshou[7] = i*4+j+1;}if((i*4+j) == 9){jieshou[7] = 0;}if((i*4+j) > 9){jieshou[7] = i*4+j;}}/******************5组**************************/{//jieshou[8] = i*4+j;if((i*4+j) < 9){jieshou[8] = i*4+j+1;}if((i*4+j) == 9){jieshou[8] = 0;}if((i*4+j) > 9){jieshou[8] = i*4+j;}jieshou[8] = jieshou[8] << 4;}if(jj == 10){//jieshou[9] = i*4+j;if((i*4+j) < 9){jieshou[9] = i*4+j+1;}if((i*4+j) == 9){jieshou[9] = 0;}if((i*4+j) > 9){jieshou[9] = i*4+j;}}/******************6组**************************/ if(jj == 11){//jieshou[10] = i*4+j;if((i*4+j) < 9){jieshou[10] = i*4+j+1;}if((i*4+j) == 9){jieshou[10] = 0;if((i*4+j) > 9){jieshou[10] = i*4+j;}jieshou[10] = jieshou[10] << 4;}if(jj == 12){//jieshou[11] = i*4+j;if((i*4+j) < 9){jieshou[11] = i*4+j+1;}if((i*4+j) == 9){jieshou[11] = 0;}if((i*4+j) > 9){jieshou[11] = i*4+j;}}/******************7组**************************/ if(jj == 13){//jieshou[12] = i*4+j;if((i*4+j) < 9){jieshou[12] = i*4+j+1;}if((i*4+j) == 9){jieshou[12] = 0;}if((i*4+j) > 9){jieshou[12] = i*4+j;}jieshou[12] = jieshou[12] << 4;}if(jj == 14){//jieshou[13] = i*4+j;if((i*4+j) < 9){jieshou[13] = i*4+j+1;}if((i*4+j) == 9){jieshou[13] = 0;}if((i*4+j) > 9){jieshou[13] = i*4+j;}}/******************8组**************************/ if(jj == 15){//jieshou[14] = i*4+j;if((i*4+j) < 9){jieshou[14] = i*4+j+1;}if((i*4+j) == 9){jieshou[14] = 0;}if((i*4+j) > 9){jieshou[14] = i*4+j;}jieshou[14] = jieshou[14] << 4;}if(jj == 16){//jieshou[15] = i*4+j;if((i*4+j) < 9){jieshou[15] = i*4+j+1;}if((i*4+j) == 9){jieshou[15] = 0;}if((i*4+j) > 9){jieshou[15] = i*4+j;}}/******************9组**************************/ if(jj == 17){//jieshou[16] = i*4+j;if((i*4+j) < 9){jieshou[16] = i*4+j+1;}if((i*4+j) == 9){jieshou[16] = 0;}if((i*4+j) > 9){jieshou[16] = i*4+j;}jieshou[16] = jieshou[16] << 4;}if(jj == 18){//jieshou[17] = i*4+j;if((i*4+j) < 9){jieshou[17] = i*4+j+1;}if((i*4+j) == 9){jieshou[17] = 0;}if((i*4+j) > 9){jieshou[17] = i*4+j;}}/******************10组**************************/ if(jj == 19){//jieshou[18] = i*4+j;if((i*4+j) < 9){jieshou[18] = i*4+j+1;}if((i*4+j) == 9){jieshou[18] = 0;}if((i*4+j) > 9){jieshou[18] = i*4+j;}jieshou[18] = jieshou[18] << 4;}if(jj == 20){//jieshou[19] = i*4+j;if((i*4+j) < 9){jieshou[19] = i*4+j+1;}if((i*4+j) == 9){jieshou[19] = 0;}if((i*4+j) > 9){jieshou[19] = i*4+j;}}}}}}}}void UartAction(unsigned char *buf, unsigned char len){//在接收到的数据帧后添加换车换行符后发回// buf[len++] = '\r';//buf[len++] = '\n';UartWrite(buf, (len-2));}【真值表】【图片展示】。
如何使用串口调试助手Keil软件仿真的串口调试技巧
如何使用串口调试助手Keil软件仿真的串口调试技巧在嵌入式系统开发中,串口调试是一项非常重要的技术。
Keil软件是一个广泛应用于嵌入式系统开发的软件平台,通过其内置的串口调试助手,我们可以方便地进行仿真的串口调试。
本文将介绍如何使用串口调试助手Keil软件仿真的串口调试技巧。
1. 了解串口基础知识在开始使用串口调试助手之前,首先需要了解一些串口的基础知识。
串口通信是一种通过串行传输数据的通信方式,常用的串口通信标准有RS232、RS485等。
了解波特率、数据位、停止位、校验位等串口通信参数的含义和选择是必要的。
2. 配置串口参数打开Keil软件后,选择对应的工程文件,并进入工程配置页面。
在这里,我们可以找到串口调试助手的配置选项。
根据实际需求,设置串口通信的参数,如波特率、数据位、停止位、校验位等。
确保与目标设备的串口参数一致,才能正常进行串口通信。
3. 编写串口发送与接收代码在代码中,我们需要编写串口发送和接收的相关代码。
通过Keil软件提供的API函数,我们可以方便地实现数据的发送和接收。
在发送数据时,需要将数据写入到相应的寄存器,以便传输到串口。
而在接收数据时,需要从寄存器中读取数据。
通过合理设计代码,可以实现稳定可靠的串口通信。
4. 仿真运行程序完成代码编写后,我们可以进行仿真运行,以验证串口调试功能的正确性。
在Keil软件中,可以选择进行单步调试、断点调试或连续运行调试。
通过监视寄存器的值变化、观察串口发送与接收的数据情况,可以帮助我们进行串口调试。
5. 使用串口调试助手测试在完成仿真运行后,我们可以使用串口调试助手进行测试。
打开串口调试助手,并选择与目标设备串口参数一致的配置。
点击打开串口,即可开始接收串口发送的数据。
通过观察串口调试助手输出的数据,可以验证串口通信的正确性。
6. 调试技巧与注意事项在使用串口调试助手Keil软件进行串口调试时,还需要注意一些调试技巧与注意事项。
首先,确保串口连接正确可靠,避免松动或接触不良导致数据传输错误。
串口调试助手的使用方法
串口调试助手的使用方法串口调试助手是一种用于调试和监控串口通信的工具。
它可以帮助用户监视串口数据的发送和接收,发送自定义的命令以及接收和显示设备返回的数据。
使用串口调试助手可以方便地进行串口通信的调试和测试工作。
下面,我将详细介绍串口调试助手的使用方法。
2.连接串口设备:将串口设备通过串口线连接到电脑上。
如果你的电脑没有串口接口,可以使用USB转串口线或串口扩展器。
3.打开串口调试助手:打开串口调试助手软件,点击菜单栏中的“连接”或类似的选项,选择正确的串口端口。
通常,串口端口名称类似于COM1、COM2等。
5.监控串口数据:在打开串口并配置参数后,串口调试助手会开始监听串口数据。
你可以在软件中的接收窗口看到串口设备发送的数据。
通常,串口设备会以ASCII码或十六进制的形式发送数据。
6.发送自定义指令:有时候,你可能需要向串口设备发送指令,例如获取设备状态或控制设备的功能。
你可以在串口调试助手的发送窗口中输入相应的指令,并选择发送命令。
发送指令后,你可以通过接收窗口来查看设备返回的数据。
7.存储数据日志:串口调试助手通常提供将数据保存为日志的选项。
你可以选择保存接收和发送的数据,方便后续的分析和处理。
8.设置数据显示格式:有些串口调试助手提供数据显示格式的设置选项。
你可以选择将接收的数据以ASCII码或十六进制的形式显示,并设置数据的显示格式。
9.检查错误信息:有时候,串口通信可能会遇到一些错误,例如数据传输错误或配置问题。
串口调试助手通常会提供错误信息的显示和解决方案。
你可以查看软件中的错误窗口来获取相关的错误信息,并根据说明来解决问题。
10.关闭串口连接:当你完成串口通信测试或调试任务后,记得关闭串口连接。
你可以在串口调试助手软件的选项中找到关闭串口连接的选项。
串口调试助手使用说明
串口调试助手使用说明为简单明了,有些不言自明的功能不作介绍。
1串口调试助手1.1设置串口参数:串口号:1-16波特率:600-256000,>115200时需要硬件支持。
2接收区/键盘发送区2.1接收数据a)设置串口参数b)如果要按十六进制形式显示接收数据,将十六进制显示选项选中。
c)点击打开/关闭串口区中的打开串口按钮。
2.2显示接收数据的长度因某些限制,显示接收数据的文本不能太长,所以当显示文本长度快达到62K时会自动将显示文本删减到32K,此时文本可保留32K的字符或约10K的十六进制数据显示。
2.3在键盘上发送英文字符a)在接收区/键盘发送区的输入框中用鼠标点一下。
b)在键盘按下按键立刻发送。
在这里不能发送回车换行,也不能发送汉字,若要发送请在单字符串发送区发送。
3发送数据可以发送单字符串,多字符串(字符串序列)或直接在键盘上发送英文字符。
有两种发送数据格式,一种是普通的字符串,另外一种是十六进制数据即HEX格式数据。
发送HEX格式数据时要在字符串输入区中输入HEX格式字符串,并且要将相应区内的十六进制发送选项选中。
例:HEX格式数据字符串12 34 AB CD FF3.1单字符串发送区3.1.1自动发送,自动发送周期:此项功能可以每隔一段时间反复地自动发送输入框中的数据,点击自动发送按钮后即启动自动发送功能。
自动发送周期最大为65535mS。
3.2多字符串发送区在多字符串发送区可以发送一个字符串,或者自动地、依次发送所有的字符串。
请把鼠标移到“接收区/键盘发送区”和“多字符串发送区”之间,当鼠标形状发生变化时按下鼠标器的左键不松开,然后移动鼠标,将“多字符串发送区”的宽度调宽一些,让“间隔时间”显露出来。
3.2.1发送一个字符串a)输入字符串。
b)如果要发送16进制数据,要先在字符串后的HEX选项框中打上对勾。
c)点击发送按钮。
发送后,按钮上的数字作为当前字符串序号保存起来,此序号在自动循环发送中要用到它。
串口调试助手VC源程序及详细编程过程
据数留残除清以区冲缓读预先//;)(tupnIteG.mmoClrtc_m 0为度长据数区收接前当置设// ;)0(neLtupnIteS.mmoClrtc_m 件事mmoCnO的据数收接个一发引将时符字个1于等或于多有中区冲缓收接口串当每示表1数参// ; ) 1 ( d l o h s er h T R t e S . m m oCl r t c _ m ; ) 1 ( e d o M tu p n I t e S . m m oCl r t c _ m 据数取检式方制进二以 // 位止停个1�位据数个8�验校无�0069率特波// ;)"1,8,n,0069"(sgnitteSteS.mmoClrtc_m ; )" t r o p l a i r es n e p o t o nn a c " ( x o B e g ass e M x f A esle 口串开打//;)EURT(nepOtroPteS.mmoClrtc_m ) )( n e p O t r o P te G . m m o C l r t c_m ! ( f i 1moc择选// ;)1(troPmmoCteS.mmoClrtc_m ; )E S L A F ( n e p Ot r o P t e S . m m oCl r t c _ m ) ) ( n e p O t r oP t e G . m m o C l rtc _ m ( f i e r e h n o i t az i l a i t i n i a r t x e d d A :OD O T / / �码代下如入加�口串开打)(golaiDtinInO::glDtseTmmoCSC的框话对主在们我在现。口串开打中数函 理处的钮按该在�钮按始开个一做中序程在如例�口串开打候时的要需你在以可你 数 参 口 串 置 设 和 口 串 开 打 . 6
VC编写串口调试助手(含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独显的笔记本,装的win764位旗舰版,因此VC6兼容不是太好,有些小毛病,不过不影响编写。
串口调试助手V2.2 使用说明
合作方面的事宜可通过电子邮件联系:合作联系
2002.08
使用窗口悬浮功能:点击程序左下角的针状按钮可以使程序置于最上层,保持可见;
放大至全屏:当需要扩大接收窗口以方便观看数据时,可以点击右上角最大化按钮
另外:还要注意的是调试串口时,插拨串口接头应尽量关闭计算机,至少保证一端是关闭的。
其它串口资料如接线、标准、源代码、编程、串口网络可到 龚建伟技术主页 查找,特殊问题可以通过EMAIL与作者联系:webmaster@
串口调试助手V2.2 使用说明
使用平台: WIN9X/NT/2000/XP
本软件目前仅供三线制(NONMODEM)串口调试之用,所有功能均置于界面上,一目了然,其义自明,这里仅对十六进制发送作一说明:
十六进制发送:选中(CHECK)十六进制发送后,发送框中所填字符每两个字符之间应有一个空隔,如:01 23 00 34 45
应朋友们的要求,本程序将在近期增加串口数据捕获功能,即不占用串口来观察计算机上所有串口接收和发送的数据,请留意。
作者: 龚建伟 工学博士
欢迎您与我们合作
从事机器人性能测量、传感与控制、各种移动机器人、工业机器人、光学测量、图像处理、机电系统集成、机电控制以及各种自动控制系统,至今完成了大量的研究课题与科研项目,在国内外期刊上发表论文多篇,积累了丰富的经验,从最基本的开发,我们都愿意涉足,欢迎研究单位、企业和个人与我们合作。可以到龚建伟技术主页作详细了解。
串口调试助手源码
串口调试助手程序框架(一)【截图】【源码】main.cpp#include<windows.h>#include<commctrl.h>#include<iostream>#include<stdio.h>#include"resource.h"using namespace std;HINSTANCE hInst;//窗口实例HWND hRDCLEAR, hSDCLEAR;HMENU hRDCHAR;void Init(HWND hwndDlg){SetWindowText(GetDlgItem(hwndDlg, SETXONC), "0x13");SetWindowText(GetDlgItem(hwndDlg, SETXOFFC), "0x19");SetWindowText(GetDlgItem(hwndDlg, SETTO), "0");SendDlgItemMessage(hwndDlg, RDCHAR, BM_SETCHECK, 1, 0);//把RadioBox RDCHAR设置为选中SendDlgItemMessage(hwndDlg, SDCHAR, BM_SETCHECK, 1, 0);//默认发送字符SendDlgItemMessage(hwndDlg, CTASY, BM_SETCHECK, 1, 0);//默认异步通信//在一个groupbox中必须有一个radiobox的属性:组为真//串口号SetWindowText(GetDlgItem(hwndDlg, SETCOMNO), "COM4");//默认值SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("COM1"));SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("COM2"));SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("COM3"));SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("COM4"));SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("COM5"));SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("COM6"));SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("COM7"));SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("COM8"));SendDlgItemMessage(hwndDlg, SETCOMNO, CB_ADDSTRING, 0, (LPARAM)("COM9"));//波特率SetWindowText(GetDlgItem(hwndDlg, SETBR), "9600");//默认值SendDlgItemMessage(hwndDlg, SETBR, CB_ADDSTRING, 0, (LPARAM)("1200"));SendDlgItemMessage(hwndDlg, SETBR, CB_ADDSTRING, 0, (LPARAM)("2400"));SendDlgItemMessage(hwndDlg, SETBR, CB_ADDSTRING, 0, (LPARAM)("4800"));SendDlgItemMessage(hwndDlg, SETBR, CB_ADDSTRING, 0, (LPARAM)("9600"));SendDlgItemMessage(hwndDlg, SETBR, CB_ADDSTRING, 0, (LPARAM)("14400"));SendDlgItemMessage(hwndDlg, SETBR, CB_ADDSTRING, 0, (LPARAM)("28800"));SendDlgItemMessage(hwndDlg, SETBR, CB_ADDSTRING, 0, (LPARAM)("38400"));SendDlgItemMessage(hwndDlg, SETBR, CB_ADDSTRING, 0, (LPARAM)("57600"));SendDlgItemMessage(hwndDlg, SETBR, CB_ADDSTRING, 0, (LPARAM)("115200"));//数据位SetWindowText(GetDlgItem(hwndDlg, SETBS), "8");//默认值SendDlgItemMessage(hwndDlg, SETBS, CB_ADDSTRING, 0, (LPARAM)("4"));SendDlgItemMessage(hwndDlg, SETBS, CB_ADDSTRING, 0, (LPARAM)("5"));SendDlgItemMessage(hwndDlg, SETBS, CB_ADDSTRING, 0, (LPARAM)("6"));SendDlgItemMessage(hwndDlg, SETBS, CB_ADDSTRING, 0, (LPARAM)("7"));SendDlgItemMessage(hwndDlg, SETBS, CB_ADDSTRING, 0, (LPARAM)("8"));//校验位SetWindowText(GetDlgItem(hwndDlg, SETPAR), "N");//默认值SendDlgItemMessage(hwndDlg, SETPAR, CB_ADDSTRING, 0, (LPARAM)("N"));SendDlgItemMessage(hwndDlg, SETPAR, CB_ADDSTRING, 0, (LPARAM)("odd"));SendDlgItemMessage(hwndDlg, SETPAR, CB_ADDSTRING, 0, (LPARAM)("even"));//停止位SetWindowText(GetDlgItem(hwndDlg, SETSB), "1");//默认值SendDlgItemMessage(hwndDlg, SETSB, CB_ADDSTRING, 0, (LPARAM)("1"));SendDlgItemMessage(hwndDlg, SETSB, CB_ADDSTRING, 0, (LPARAM)("2"));}BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {//窗口回调函数switch (uMsg)//消息处理{case WM_INITDIALOG://初始化{Init(hwndDlg);}return TRUE;case WM_CLOSE://关闭窗口{EndDialog(hwndDlg, 0);}return TRUE;case WM_COMMAND://菜单消息{switch (LOWORD(wParam)){case RDCLEAR://清空接收框数据{SetWindowText(hRDCLEAR, "");}return TRUE;case SDCLEAR://清空发送框数据{SetWindowText(GetDlgItem(hwndDlg, SDTEXT), "");}return TRUE;case SDSEND://发送数据{TCHAR szBuf[80];//缓存区string temp;GetWindowText(GetDlgItem(hwndDlg, SDTEXT), szBuf, 80);//获得接收框的文本temp = szBuf;//拼接字符串//cout<<temp;SetWindowText(GetDlgItem(hwndDlg, RDTEXT), temp.c_str());}return TRUE;case SETOP:{//打开串口}return TRUE;case SETCP:{//关闭串口}return TRUE;case SETSO:{}return TRUE;}}return TRUE;}return FALSE;}int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {hInst = hInstance;InitCommonControls();return DialogBox(hInst, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DlgMain);}【源码】resource.h#ifndef IDC_STATIC#define IDC_STATIC (-1)#endif#define DLG_MAIN 100#define RDBOX 40000#define RDTEXT 40001#define RDCHAR 40002#define RDHEX 40003#define RDCLEAR 40004#define SDCHAR 40005#define SDHEX 40006#define SDCLEAR 40007#define SDSEND 40008#define SDAS 40009#define SDASTIME 40010#define SETCOMNO 40011#define CTSYN 40012#define CTASY 40013#define SETBR 40014#define SDTEXT 40015#define SETXONC 40016#define SETXOFFC 40017#define SETTO 40018#define SETPAR 40019#define SETSB 40020#define SETBS 40021#define SETOP 40022#define SETCP 40023#define SETSO 40024【源码】resource.rc#include<windows.h>#include<commctrl.h>#include<richedit.h>#include"resource.h"//// Dialog resources//LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRALDLG_MAIN DIALOG 0, 0, 635, 304STYLE DS_3DLOOK| DS_CENTER| DS_MODALFRAME| DS_SHELLFONT| WS_CAPTION| WS_VISIBLE| WS_POPUP| WS_SYSMENU CAPTION "SerialPortDebug"FONT 8, "Ms Shell Dlg"{GROUPBOX "Setting", 0, 257, 7, 365, 290, 0, WS_EX_LEFTLTEXT "Select Port", 0, 284, 30, 36, 8, SS_LEFT, WS_EX_LEFTGROUPBOX "Communication Type", 0, 278, 62, 295, 35, 0, WS_EX_LEFTLTEXT "ByteSize", 0, 469, 120, 28, 8, SS_LEFT, WS_EX_LEFTLTEXT "BaudRate", 0, 297, 122, 33, 8, SS_LEFT, WS_EX_LEFTGROUPBOX "Send Data", 0, 12, 135, 240, 162, 0, WS_EX_LEFTLTEXT "StopBits", 0, 471, 161, 27, 8, SS_LEFT, WS_EX_LEFTLTEXT "Parity", 0, 299, 162, 18, 8, SS_LEFT, WS_EX_LEFTAUTOCHECKBOX "fParity", 0, 401, 162, 35, 8, 0, WS_EX_LEFTAUTOCHECKBOX "CTS", 0, 296, 202, 30, 8, 0, WS_EX_LEFTAUTOCHECKBOX "DSR", 0, 365, 202, 31, 8, 0, WS_EX_LEFTAUTOCHECKBOX "DTR", 0, 436, 202, 31, 8, 0, WS_EX_LEFTAUTOCHECKBOX "XON/XOFF", 0, 507, 202, 53, 8, 0, WS_EX_LEFTLTEXT "ms", 0, 131, 228, 10, 8, SS_LEFT, WS_EX_LEFTLTEXT "ms", 0, 562, 237, 10, 8, SS_LEFT, WS_EX_LEFTLTEXT "XonChar", 0, 293, 238, 28, 8, SS_LEFT, WS_EX_LEFTLTEXT "XoffChar", 0, 383, 238, 28, 8, SS_LEFT, WS_EX_LEFTLTEXT "Timeouts", 0, 478, 238, 30, 8, SS_LEFT, WS_EX_LEFTGROUPBOX "Receive Data", RDBOX, 15, 10, 235, 120, 0, WS_EX_LEFTEDITTEXT RDTEXT, 20, 25, 225, 75, ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY, WS_EX_LEFTAUTORADIOBUTTON "Char", RDCHAR, 26, 112, 31, 8, WS_GROUP, WS_EX_LEFTAUTORADIOBUTTON "Hex", RDHEX, 80, 112, 29, 8, 0, WS_EX_LEFTPUSHBUTTON "Clear", RDCLEAR, 196, 108, 45, 14, 0, WS_EX_LEFTAUTORADIOBUTTON "Char", SDCHAR, 26, 208, 31, 8, WS_GROUP, WS_EX_LEFTAUTORADIOBUTTON "Hex", SDHEX, 82, 208, 29, 8, 0, WS_EX_LEFTPUSHBUTTON "Clear", SDCLEAR, 132, 204, 45, 14, 0, WS_EX_LEFTPUSHBUTTON "Send", SDSEND, 196, 204, 45, 14, 0, WS_EX_LEFTAUTOCHECKBOX "Auto send", SDAS, 26, 228, 48, 8, 0, WS_EX_LEFTEDITTEXT SDASTIME, 86, 225, 40, 14, ES_RIGHT | ES_AUTOHSCROLL, WS_EX_LEFTCOMBOBOX SETCOMNO, 337, 27, 95, 30, CBS_DROPDOWN | CBS_HASSTRINGS, WS_EX_LEFTAUTORADIOBUTTON "Synchronous ", CTSYN, 326, 75, 59, 8, WS_GROUP, WS_EX_LEFTAUTORADIOBUTTON "Asynchronous ", CTASY, 472, 77, 63, 8, 0, WS_EX_LEFTCOMBOBOX SETBR, 337, 120, 48, 30, CBS_DROPDOWN | CBS_HASSTRINGS, WS_EX_LEFTEDITTEXT SDTEXT, 20, 147, 227, 45, ES_AUTOHSCROLL, WS_EX_LEFTEDITTEXT SETXONC, 325, 235, 40, 14, ES_AUTOHSCROLL, WS_EX_LEFTEDITTEXT SETXOFFC, 417, 235, 40, 14, ES_AUTOHSCROLL, WS_EX_LEFTEDITTEXT SETTO, 512, 235, 40, 14, ES_AUTOHSCROLL, WS_EX_RIGHTCOMBOBOX SETPAR, 338, 160, 48, 30, CBS_DROPDOWN | CBS_HASSTRINGS, WS_EX_LEFTCOMBOBOX SETSB, 512, 159, 48, 30, CBS_DROPDOWN | CBS_HASSTRINGS, WS_EX_LEFTCOMBOBOX SETBS, 512, 117, 48, 30, CBS_DROPDOWN | CBS_HASSTRINGS, WS_EX_LEFTPUSHBUTTON "Open Port", SETOP, 297, 272, 45, 14, 0, WS_EX_LEFTPUSHBUTTON "Close Port", SETCP, 387, 272, 45, 14, 0, WS_EX_LEFTDEFPUSHBUTTON "Stop I/O", SETSO, 473, 271, 45, 14, 0, WS_EX_LEFT}//// Manifest resources//LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL1 RT_MANIFEST".\\manifest.xml"【源码】manifest.xml< ? xml version = "1.0" encoding = "UTF-8" standalone = "yes" ? ><assembly xmlns = "urn:schemas-microsoft-com:asm.v1" manifestVersion = "1.0"><dependency><dependentAssembly><assemblyIdentity type = "win32" name = "mon-Controls" version = "6.0.0.0" processorArchitecture = "*" publicKeyToken = "6595b64144ccf1df" language = "*" / >< / dependentAssembly>< / dependency><trustInfo xmlns = "urn:schemas-microsoft-com:asm.v3"><security><requestedPrivileges><requestedExecutionLevel level = "asInvoker" uiAccess = "false" / > < / requestedPrivileges> < / security>< / trustInfo>< / assembly>。
串口调试助手源程序及编程详细过程
串口调试助手源程序及编程详细过程作者:龚建伟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选项卡,选择C SCommTest Dlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。
4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。
串口调试助手使用教程
串口调试助手使用教程首先,确保你已经正确连接了串口调试助手软件和目标设备的串口。
1. 打开串口调试助手软件。
在软件界面的顶部菜单栏中,通常会有一个“串口”的选项,点击它展开串口设置。
2. 查找并选择正确的串口。
在串口设置中,你可以看到可用的串口列表。
选择正确的串口,通常以“COM”开头并带有具体的串口号。
如果你不确定应该选择哪个串口,可以尝试一个接一个地选择每个串口,然后观察是否有数据传输。
3. 配置串口参数。
继续在串口设置中,通常会有波特率、数据位、停止位、校验位和流控制等选项。
确保这些参数与你的设备设置相匹配。
如果你不确定设备的串口参数,可以参考设备的说明书或者询问设备厂商。
4. 打开串口。
完成串口参数配置后,点击一个按钮或者选项来打开串口连接。
通常会有一个“打开串口”、“连接”或者类似的按钮。
如果一切正常,你应该能在软件界面上看到串口的连接状态。
5. 监听串口数据。
一旦串口连接成功,你可以开始接收和发送数据。
通常会有一个数据接收区和一个数据发送区。
数据接收区会实时显示通过串口接收到的数据。
你可以通过不同的设置来选择以何种方式显示数据,例如文本、十六进制等。
6. 发送数据。
如果你需要通过串口发送数据到目标设备,你可以在数据发送区输入相应的数据,然后点击发送按钮或者类似的选项。
通过串口调试助手,你可以发送文本、十六进制等各种类型的数据。
7. 保存数据。
如果你需要保存通过串口接收或发送的数据,你可以使用串口调试助手提供的保存功能。
通常会有一个保存按钮或者菜单选项,点击它可以将数据保存为文件。
8. 关闭串口。
当你不再需要使用串口时,记得关闭串口连接。
一般会有一个“关闭串口”或者类似的按钮。
这样可以释放串口资源,同时避免不必要的错误。
以上就是使用串口调试助手的基本步骤。
根据不同的软件界面和功能设置,可能会略有差异,但基本原理是相似的。
请根据具体软件的说明和使用指南进行相关操作。
经典串口调试助手源程序及串口通信设置
经典串口调试助手源程序及串口通信设置串口调试助手是一种用于串口通信调试的工具,它可以通过串口与外部设备进行数据的读写和处理,常用于单片机、嵌入式系统、电子设备等领域的开发调试中。
经典串口调试助手源程序经典串口调试助手是一款经典的串口调试工具,其源程序使用C语言编写,提供了丰富的功能和易于使用的界面,被广泛应用于各种领域的开发调试中。
该工具可以在Windows操作系统中运行,并支持多种串口通信协议,包括RS232、RS485、RS422等。
以下是经典串口调试助手部分源程序的示例:```c// 打开串口HANDLE OpenSerialPort(const char* portName){ HANDLE hCom; hCom = CreateFile(portName, // 串口名称GENERIC_READ | GENERIC_WRITE, // 读写访问0,// 无共享NULL,// 安全描述符OPEN_EXISTING,// 打开方式FILE_ATTRIBUTE_NORMAL, // 文件属性NULL); // 文件模板if (hCom ==INVALID_HANDLE_VALUE) // 判断是否打开成功{ return NULL; } return hCom;}// 发送数据int SendData(HANDLE hCom, const char* data, int len){ DWORD writeSize; if (!WriteFile(hCom, data, len, &writeSize, NULL)) // 写入数据{ return -1; } return writeSize;}// 接收数据int ReceiveData(HANDLE hCom, char* data, int len){ DWORD readSize; if (!ReadFile(hCom, data, len,&readSize, NULL)) // 读取数据{ return -1; } return readSize;}// 关闭串口int CloseSerialPort(HANDLE hCom){ if(!CloseHandle(hCom)) // 关闭句柄{ return-1; } return 0;}```上述函数实现了打开串口、发送数据、接收数据和关闭串口等基本功能,可以作为串口通信的底层驱动实现。
串口调试助手源代码
串口调试助手预源代码using System;using System.Collect ion s.Ge neric;using p onen tModel;using System.Data;using System.Draw ing;using System.Linq;using System.Text;using System.Thread in g.Tasks;using System.Wi ndows.Forms;using Syste m.IO;using Syste m.IO .Ports;using System.Thread ing;using DevExpress.XtraEditors;using System.Text.RegularExpressi ons;n amespace Win dowsFormsApplicatio n3 {public partial class Form1 : XtraForm {SerialPort sp1 = new SerialPort(); int Flag = 0;int StateCha nged = 0;int StateCha nged_Ascii = 1; int StateCha nged_16 = 0;string Temp = null;stri ng Temp_memoSe nd = n ull;private void memoSe nd_EditValueCha nged(object sen der, Even tArgs e) { - }public Form1(){In itializeComp onen t();sp1.DataReceived += sp1_DataReceived; }private void Form1_Load(object sen der, Even tArgs e) { -this.MaximizeBox = false;// 检查是否有串口stri ng[] str = SerialPort.GetPortNames();if (str == null) __________ |{MessageBox.Show(”本机没有串口!", "error");return;}// 添加串口项目foreach (stri ng port in Syste m.IO.P orts.SerialPort.GetPortNames()) { cbSerial.Properties .I tems.Add(port);}// 串口设置默认选择项cbSerial.Selectedl ndex = 0;Con trol.CheckForlllegalCrossThreadCalls = false; spl.DataReceived += new SerialDataReceivedEve ntHa ndler(sp1_DataReceived); //订阅委托e)//SerialPort sp1 = new SerialPort();if (!sp1.lsOpe n)〃串口是关闭的,设置参数,打开串口{try{// 获取串口号string serialName = cbSerial.Selectedltem.ToString(); sp1.PortName = serialName;// 设置各参数stri ng strBaudRate = cbBaudRate.Text;string strDateBits = cbDataBits.Text;string strStopBits = cbStop.Text;sp1.BaudRate = Con vert.ToI nt32(strBaudRate);〃波特率sp1.DataBits = Con vert.ToI nt32(strDateBi ts);// 数据位switch (cbStop.Text) // 停止位{case "1":sp1.StopBits = StopBits. On e;break;case "1.5":sp1.StopBits = StopBits. On e;break;case "2":sp1.StopBits = StopBits.Two;break; default:case " 奇校验":sp1.Parity = Parity.Odd; break;精品文档", "Error");case "偶校验":spl.Parity = Parity.Eve n; break; default:MessageBox.Show("Error: 参数不正确!break;labSerial.Text =" 串口号:” + sp1 .P ortName; labState.Text ="状 态:打开";}catch (System.Excepti on ex) {MessageBox.Show("Error:" + ex.Message, "Error"); return; } } }//private void CloseSerial_Click(object sen der, Even tArgs e) 〃{// if (sp1.lsOpe n) // { // sp1.Close(); // labSerial.Text =" 串口号:” + sp1.PortName; // labState.Text ="状 态:关闭";// } 〃}private void Sen d_Click(object sen der, Even tArgs e) { - stri ng StrSe nd = memoSe nd.Text; if (!sp1.lsOpe n) {MessageBox.Show (” 请先打开串口! ", "Error");return; } else {if (rbt nSen dStr.Checked)//〃bt nOpe n.En abled =false; 字符串发送{if (ckTimeSe nd.Checked&& !(stri ng.lsNullOrEmpty(textTime.Text)))//判断是否定时发送数据{string Time = textTime.Text;tmSe nd.l nterval = int. Parse(Time) * 1000;//时间单位是秒,化成毫秒单位后的空格//stri ng StrSe nd_2 = StrSe nd_1.Replace (” ", ""); //stri ng StrSe nd_3 = stri ng.J oi n (” ",Regex.Matches(StrSend_2, @"..|.").Cast<Match>().ToList());stri ng[] StrArray = StrSe nd_1.Split(' '); // 用空格符隔开字符串数组var Str_Se nd = new List<stri ng>();// i nt byteBufferLe ngth = StrArray.Le ngth; 数组StrArray 的长度for (int i = 0; i < StrArray.Le ngth; i++){if (StrArray[i].Trim()=="") {//byteBufferLe ngth--; con ti nue; }else} else //{if (ckTimeSe nd.Checked&& !(string.IsNullOrEmpty(textTime.Text))){卜六进制发送//tmSe nd.Start();//开启定时器{if (StrArray[i].Le ngth < 3){Str_Se nd.Add(StrArray[i]);}else{Str_Se nd.AddRa nge(Devide(StrArray[i]));}}}int byteBufferLe ngth = Str_Se nd.Cou nt; byte[] byteBuffer = new byte[byteBufferLe ngth];in t ii = 0;//decNum = Con vert.ToI nt32(Str_Se nd[i], 16); // 把字符串转成16进制数〃byteBuffer[ii] = Co nvert.ToByte(decNum);〃}try{decNum = Con vert.ToI nt32(Str_Se nd[i], 16); // 把字符串转成16进制数byteBuffer[ii] = Co nvert.ToByte(decNum);}catch (System.Exceptio n ex){MessageBox.Show(”输入错误!","提示");return;}ii++;}sp1.Write(byteBuffer, 0, byteBuffer.Length);// 从第0个开始写入byteBuffer ,长度bytebuffer 的长度。
串口调试助手使用说明和技术总结
串口调试助手使用说明和技术总结一、引言二、使用说明1.硬件准备:首先需要一对串口线,将电脑的串口与设备的串口进行连接。
确保连接正确无误。
2. 软件安装:选择一款合适的串口调试助手软件,如Tera Term、SecureCRT等,并进行安装。
3.打开串口:打开串口调试助手软件,选择正确的串口端口号,并设置波特率。
一般情况下,设备的串口通信参数可以在设备的说明书中找到。
4.进行数据收发:点击软件界面上的“打开串口”按钮后,即可开始进行数据的收发。
可以直接在软件的发送窗口中输入要发送的数据,并点击“发送”按钮,或者通过点击“读取文件”按钮,从本地文件中读取数据并发送。
同时,接收到的数据也会在软件的接收窗口中实时显示。
5.数据解析:对于不同格式的数据,可以通过软件提供的解析功能进行解析。
一般情况下,串口数据是以字节流的形式进行传输的,解析时需要将字节解析为可读的格式。
6.其他功能:串口调试助手软件一般还提供了其他功能,如数据录制、数据回放、数据比对等。
根据实际需求,可以灵活运用这些功能。
三、技术总结1.串口通信协议:串口调试助手在数据收发过程中依赖于串口通信协议。
常见的串口通信协议有RS232、RS485等。
了解和理解这些协议对于正确使用串口调试助手非常重要。
3.数据解析:串口调试助手常常需要对收到的字节流进行解析,将其转化为可读的数据。
这需要根据具体的协议和数据格式进行解析工作,例如将十六进制数据转化为ASCII码等。
4.数据录制与回放:一些串口调试助手软件提供数据录制和回放功能,方便在需要时重新进行调试或查看数据。
这对于复杂系统的调试和故障排除非常有用。
5.多串口支持:一些串口调试助手软件支持多串口同时进行数据收发和调试。
这对于同时调试多个设备通信时非常方便。
6.错误处理:在使用串口调试助手过程中,可能会遇到数据传输错误、设备无响应等问题。
正确处理这些错误非常重要,可以使用软件提供的日志记录功能或者手动检查设备连接等方式来定位和解决问题。
友善串口调试助手教程
友善串口调试助手教程友善串口调试助手是一款功能强大的串口调试工具,可以帮助开发人员在进行串口通信时进行数据的传输、接收和调试。
它提供了简单易用的用户界面和丰富多样的功能,非常适合初学者和经验丰富的开发人员使用。
下面是友善串口调试助手的教程,帮助大家快速上手使用该工具。
第一步:安装友善串口调试助手首先,我们需要在友善电子官网上下载友善串口调试助手的安装包,然后进行安装。
安装完成后,可以在桌面或开始菜单上找到友善串口调试助手的图标,点击运行即可打开工具。
第二步:连接串口设备在使用友善串口调试助手之前,我们需要将要调试的串口设备连接到计算机上。
可以使用串口转USB的转接线,将串口设备与计算机连接起来。
第三步:选择串口打开友善串口调试助手后,首先要选择正确的串口。
点击工具栏上的“串口选择”按钮,会弹出一个下拉菜单,列出当前计算机上可用的串口。
选择要调试的串口,并点击确定即可。
第四步:设置串口参数在选择了串口后,点击工具栏上的“串口参数设置”按钮,会弹出一个设置窗口。
在这个窗口中,可以设置串口的波特率、数据位、停止位和校验位等参数。
根据具体的串口设备要求,设置相应的参数,然后点击确定保存设置。
第五步:发送和接收数据在设置好串口参数后,就可以开始发送和接收数据了。
在工具栏上有一个文本框,可以输入要发送的数据。
在文本框中输入完数据后,点击“发送”按钮,数据就会被发送到串口设备上。
同时,在工具的主界面上会显示串口设备返回的数据,方便进行接收和调试。
第六步:保存和加载数据友善串口调试助手还提供了保存和加载数据的功能。
在工具栏上有一个“保存”按钮,可以将当前接收到的数据保存到本地文件中。
点击“保存”按钮后,会弹出一个保存对话框,选择保存的文件路径和文件名后即可保存数据。
类似地,点击工具栏上的“加载”按钮,可以加载之前保存的数据文件到工具中。
第七步:其他功能友善串口调试助手还提供了其他一些实用的功能,如自定义数据发送周期、自动回复数据等。
串口调试助手使用说明和技术总结
串口调试助手的技术报告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)串口接收显示的数据丢失原因:接收显示是影响程序性能的一个大问题,当接收到大量数据时,串口通信助手响应不太及时,这个可能与调用类中的使用机制有关,但显示也没能很好地处理,不过在实际的传输过程中是没有丢失数据的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//这是一个将字符转换为相应的十六进制值的函数 //好多 C 语言书上都可以找到 //功能:若是在 0-F 之间的字符,则转换为相应的十六进制字符,否则返回-1 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); }
目录:
1.建立项目 2.在项目中插入 MSComm 控件 3.利用 ClassWizard 定义 CMSComm 类控制变量 4.在对话框中添加控件 5.添加串口事件消息处理函数 OnComm() 6.打开和设置串口参数 7.发送数据 8.发送十六进制字符 9.在接收框中以十六进制显示 10.如何设置自动发送 11.什么是 VARIANT 数据类型?如何使用 VARIANT 数据类型?
gned.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为 2 表示接收缓冲区内有字
符,如果为 1 表示发送数据。
{
////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
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
开始吧:
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 就可以了),
串口调试助手源代码
在众多网友的支持下,串口调试助手从 2001 年 5 月 21 日发布至今,短短一个月, 在全国各地累计下载量近 5000 人次,在近 200 多个电子邮件中,20 多人提供了 使用测试意见,更有 50 多位朋友提出要串口调试助手的源代码,为了答谢谢朋 友们的支持,公开推出我最初用 VC 控件 MSComm 编写串口通信程序的源代码,并 写出详细的编程过程,姑且叫串口调试助手源程序 V1.0 或 VC 串口通讯源程序吧, 我相信,如果你用 VC 编程,那么有了这个代码,就可以轻而易举地完成串口编 程任务了。(也许本文过于详细,高手就不用看)
for(k=0;k<len;k++) //将数组转换为 Cstring 型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量 strtemp 存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
现在你可以试试程序了,将串口线接好后(不会接?去看看我写的串口接线基 本方法),打开串口调试助手,并将串口设在 com2,选上自动发送,也可以等 会手动发送。再执行你编写的程序,接收框里应该有数据显示了。
7.发送数据 先为发送按钮添加一个单击消息即 BN_CLICKED 处理函数,打开 ClassWizard->Message Maps,选择类 CSCommTestDlg,选择 IDC_BUTTON_MANUALSEND,双击 BN_CLICKED 添加 OnButtonManualsend()函数, 并在函数中添加如下代码:
// TODO: Add extra initialization here 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");
safearray_inp=variant_inp; //VARIANT 型变量转换为
ColeSafeArray 型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为 BYTE 型数组
在主对话框中加入一个复选接钮,ID 为 IDC_CHECK_HEXSEND Caption: 十六进制 发送,再利用 ClassWizard 为其添加控制变量:m_ctrlHexSend;
在 ClassView 中为 CSCommTestDlg 类添加以下两个 PUBLIC 成员函数,并输 入相应代码;
senddata.SetSize(len/2); for(int i=0;i<len;) { char lstr,hstr=str[i]; if(hstr==' ') { i++; continue; } i++; if(i>=len) break; lstr=str[i]; hexdata=ConvertHexChar(hstr); lowhexdata=ConvertHexChar(lstr); if((hexdata==16)||(lowhexdata==16)) break; else hexdata=hexdata*16+lowhexdata; i++; senddata[hexdatalen]=(char)hexdata; hexdatalen++; } senddata.SetSize(hexdatalen); return hexdatalen; }
4.在对话框中添加控件 向主对话框中添加两个编辑框,一个用于接收显示数据 ID 为 IDC_EDIT_RXDATA,另一个用于输入发送数据,ID 为 IDC_EDIT_TXDATA, 再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其 ID 设 为 IDC_BUTTON_MANUALSEND。别忘记了将接收编辑框的 Properties->Styles 中 把 Miltiline 和 Vertical Scroll 属性选上,发送编辑框若你想输入多行文字, 也可选上 Miltiline。
void CSCommTestDlg::OnButtonManualsend() { // TODO: Add your control notification handler code here UpdateData(TRUE); //读取编辑框内容 m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据 }
再打开 ClassWizard->Member Viariables 选项卡,选择 CSCommTestDlg 类,为 IDC_EDIT_RXDATA 添加 CString 变量 m_strRXData, 为 IDC_EDIT_TXDATA 添加 CString 变量 m_strTXData。说明: m_strRXData 和 m_strTXData 分别用来放入 接收和发送的字符数据。
}
}
UpdateData(FALSE); //更新编辑框内容
}
到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运 行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开 VC6 对 照着做一步写一行的,运行试试。没错吧?那么做下一步: