串口调试助手C++开发
经典串口调试助手源程序及串口通信设置
经典串口调试助手源程序及串口通信设置标题:串口调试助手之经典源程序及通信设置导言:串口调试助手是一种用于串口通信的调试工具,广泛应用于工业控制、测试等领域。
本文将介绍一种基于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位等。
串口精灵源代码
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CSCommTestDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
{
// 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.
写出详细的编程过程,姑且叫串口调试助手源程序V1.0或VC串口通讯源程序吧,
我相信,如果你用VC编程,那么有了这个代码,就可以轻而易举地完成串口编
程任务了。(也许本文过于详细,高手就不用看)
开始吧:
串口调试助手VC++6.0程序
串口调试助手源程序及编程详细过程作者:龚建伟 2001.6.20可以任意转载,但必须注明作者和说明来自,不得作为商用目次: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, version6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了),这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
C#串口调试助手
//serialPort1.Parity = (Parity)Enum.Parse(typeof(Parityset), comboBox4.SelectedItem.ToString());
} public enum Parityset {
None, odd, Even, Mark, Space } private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) //停止位 { serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), boBox5.Text); }
serialPort1.BaudRate = int.Parse(comboBox2.Text); serialPort1.DataBits = int.Parse(comboBox3.Text); serialPort1.Parity = (Parity)Enum.Parse(typeof(Parityset),
namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) {
textBox3.Text = serialPort.ReadExisting();
label10.Text = (int.Parse(label10.Text.Trim()) + 1).ToString(); //统计接收区 数据 组数
串口调试小助手怎么用?串口调试小助手使用以及常见问题解答
串⼝调试⼩助⼿怎么⽤?串⼝调试⼩助⼿使⽤以及常见问题解答串⼝调试⼩助⼿1.3是⼀款专门⽤于修改串⼝数据的调试⼩⼯具,⽀持修改串⼝波特率、校验位、数据位和串⼝停⽌位、设置接受区和发送区等功能。
其中软件⾃带的⾃定义波特率功能能够将列表框由只读变为可写,直接输⼊你想要的波特率,⽆需⼿动设定,并且当再选择其他内定的波特率时,列表框会恢复为只读的状态。
除此之外,软件内部接受⽂件采取2进制的保存⽅式,这使得该软件存储⽂件的速度远超于同类软件。
值得⼀提的是,该软件还⽀持编辑区快捷键的输出,能让串⼝编辑像Word⼀样简单⾃如。
串⼝调试⼩助⼿ v1.3 绿⾊免费版类型:调试⼯具⼤⼩:191KB语⾔:简体中⽂时间:2020-07-01查看详情使⽤教程1、连接:将ch340连接到电脑的USB接⼝上,这是买的⼀个ch340模块,⽹上⼗⼏块都可以得到。
2、检查:找到电脑的”设备管理器“:打开开始菜单,找到“计算机”;3、检查:找到电脑的”设备管理器“:单击右键在下拉菜单中选中“设备管理器”。
4、检查:找到电脑的”设备管理器“ 在电脑的“设备管理器”中查看是否有相应的硬件连接。
如果没有我们往往要下载ch340的硬件驱动,可以百度搜索⼀下,有很多的这样的驱动,任意下载⼀个安装后,在连接上就可以了。
如果正确连接应该有⼀下的结果。
软件快捷键ALT+A 发送所有内容'ALT+S 发送光标所在⾏的数据'ALT+D 发送光标所在⾏的数据,并发送回车换⾏ALT+C 清空发送区常见问题⼀、串⼝调试⼩助⼿怎样更换数据的路径?1、打开串⼝调试助⼿的软件界⾯2、在左边编辑栏中找到更换路径3、点击选择⾃⼰的预先设想的路径⼆、如何使⽤串⼝调试助⼿ComTone调试串⼝1、串⼝打开后,可随时修改通讯参数,只需要按⼀下应⽤2、设置“输⼊HEX”,则⽤户输⼊数据看作16进制字节,不区分⼤⼩写,接收的会显⽰为16进制HEX格式;如果设置“输⼊ASC“则⽤户输⼊数据看作ASCII字符,接收的也会显⽰为ASCII字符;3、选中“回车发送”,输⼊区内按回车相当于按发送按钮,如想输⼊多⾏,可⽤Ctrl+回车;不选中,则输⼊区内可⽤回车分⾏4、设”CRC校验“,加⼊了16位CRC校码放到每次发送的字节数的最后两位5、⽤户输⼊(从串⼝输出)的数据显⽰为绿⾊,从串⼝输⼊的数据显⽰为蓝⾊6、如果显⽰框中的数据太多了,想清除的话,可以点”清空显⽰“来清屏”7、如果需要保存当前配置,以便后⾯接着使⽤同样的配置,可以点”保存参数“,这样以且打开就可以使⽤默认的配置项了三、如何发送多条字符串1、打开串⼝调试助⼿⼯具2、然后配置串⼝号、波特率、数据位、停⽌位等串⼝信息3、配置好后就可以打开串⼝了4、然后点“扩展”功能,通过这个来设置要发送的多条字符串数据。
CVI串口调试总结RS232
对于CVI 串口调试助手(rs232)1 软件简单介绍1.1 串口界面串口调试助手用来与下位机连接,与下位机进行数据交换,实现PC 机与单片机的连接和实时数据采集。
实现了十六进制的数据接收,如图1-1。
图1.1 数据转化为16进制图1-2 接收字符串1.2 CVI介绍LabWindows/CVI 是National Instruments 公司(美国国家仪器公司,简称NI 公司)推出的交互式C 语言开发平台。
LabWindows/CVI 将功能强大、使用灵活的C 语言平台与用于数据采集分析和显示的测控专业工具有机地结合起来,利用它的集成化开发环境、交互式编程方法、函数面板和丰富的库函数大大增强了C 语言的功能,为熟悉C 语言的开发设计人员编写检测系统、自动测试环境、数据采集系统、过程监控系统等应用软件提供了一个理想的软件开发环境。
NI公司的LabWindows/CVI是一个久经验证的用于测试和测量的ANSI C 开发环境,极大地提高了工程师和科学家们的生产效率。
他们使用LabWindows/CVI来开发高性能的、可靠的应用程序,用于制造测试、军事/航天、通讯、设计验证和汽车工业等领域。
开发人员可以在设计阶段利用LabWindows/CVI的硬件配置助手、综合调试工具以及交互式执行功能,来运行各项功能,使得这些领域的开发流水线化。
使用内置的测量库,你可以迅速的开发出复杂的应用程序,例如多线程编程和ActiveX的服务器/客户端程序。
由于LabWindows/CVI的便利性,你可以通过在相似环境中重复使用以前的代码来维护你的代码投资,并且实现Windows、Linux®或实时平台上分布测试系统的无缝集成。
2 软件介绍CVI内部封装了RS-232 library。
2.1 callbacksCallbacks中只含有一个函数InstallComCallbackint InstallComCallback (int portNumber, int eventMask, int notifyCount, int eventCharacter, ComCallbackPtr callbackFunction, void *callbackData);Allows you to install a synchronous callback function for a particular COM port.The callback function is called whenever any of the events specified in eventMask occur on the COM port and you allow the system to process events.Example:InstallComCallback (Value, LWRS_RXCHAR, 0, 0, (void *)uartRevData, 0);2.2 control2.2.1 ComBreak (int portNumber, int breakTime_msec);A break signal is a communications signal that allows two communications devices to transmit a break signal in the transmission line. A break signal is the transmission of a special character on the communication line for a period longer than the transmission time for one character and its framing bits.2.2.2 ComSetEscape (int portNumber, int escapeCode);指导一个COM端口进行扩展功能如清除或设置RTS信号线或设置收发器模式对RS - 485。
C语言串口通信助手代码
该程序全部由C写成没有C++ 更没用MFC完全是自娱自乐给需要的人一个参考#include "stdafx.h"#include <windowsx.h>#include "resource.h"#include "MainDlg.h"#include <windows.h>#include <stdio.h>#include <stdlib.h>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"));ComboBox_InsertString(hwndCombo1,-1,TEXT("COM3"));ComboBox_InsertString(hwndCombo1,-1,TEXT("COM4"));ComboBox_InsertString(hwndCombo1,-1,TEXT("COM5"));ComboBox_SetCurSel(hwndCombo1,0);void CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime);SetTimer(hwnd,1,1000,TimerProc);return TRUE;}/*监视串口错误时使用的函数*/bool ProcessErrorMessage(char* ErrorText){char *Temp = new char[200];LPVOID lpMsgBuf;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language(LPTSTR) &lpMsgBuf,NULL);sprintf(Temp, "WARNING: %s Failed with the following error:\n%s\nPort: %d\n", (char*)ErrorText, lpMsgBuf, "com2"); MessageBox(NULL, Temp, "Application Error", MB_ICONSTOP); LocalFree(lpMsgBuf);delete[] Temp;return true;}bool openport(char *portname)//打开串口{hComm = CreateFile(portname, //串口号“com1”“com2” 调用方法:bool open; open=openport("com2");GENERIC_READ | GENERIC_WRITE, //允许读写0, //通讯设备必须以独占方式打开0, //无安全属性OPEN_EXISTING, //通讯设备已存在FILE_FLAG_OVERLAPPED, //异步I/O0); //通讯设备不能用模板打开if (hComm == INVALID_HANDLE_VALUE) //如果被占用或是没有打开时返回的是这个错误代码CloseHandle(hComm);return FALSE;}elsereturn true;}bool setupdcb(int rate_arg)//设置port的属性{DCB dcb;int rate= rate_arg;memset(&dcb,0,sizeof(dcb));if(!GetCommState(hComm,&dcb))//获取当前DCB配置return FALSE;// set DCB to configure the serial portdcb.DCBlength = sizeof(dcb);dcb.BaudRate = rate;dcb.Parity = NOPARITY; //奇偶校验值0~4分别对应无校验、奇校验、偶校验、校验置位、校验清零dcb.fParity = 0; //为1的话激活奇偶校验检查dcb.StopBits = ONESTOPBIT;//停止位个数,0~2分别对应1位、1.5位、2位停止位dcb.ByteSize = 8; //数据位数dcb.fOutxCtsFlow = 0;dcb.fOutxDsrFlow = 0;dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = 0;dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.fOutX = 0;dcb.fInX = 0;dcb.fErrorChar = 0;dcb.fBinary = 1;dcb.fNull = 0;dcb.fAbortOnError = 0;dcb.wReserved = 0;dcb.XonLim = 2;dcb.XoffLim = 4;dcb.XonChar = 0x13;dcb.XoffChar = 0x19;dcb.EvtChar = 0;// set DCBif(!SetCommState(hComm,&dcb))return false;elsereturn true;}/*串口读取相关时间设置*/bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD ReadTotalconstant,DWORD WriteTotalMultiplier,DWORD WriteTotalconstant){COMMTIMEOUTS timeouts;timeouts.ReadIntervalTimeout=ReadInterval; //读取两个字节间隔最大值mS如超过立即返回不再读取timeouts.ReadTotalTimeoutConstant=ReadTotalconstant; //如果同下面一个都为0 则无论是否读到数据都返回// 可以毫秒为单位指定一个乘数,该乘数用来计算读操作的总限时时间timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier; // 以毫秒为单位指定一个常数,用于计算读操作的总限时时间0表示不限时timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;// 写操作延时同上timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;if(!SetCommTimeouts(hComm, &timeouts))return false;elsereturn true;}int Clearn() //清除buff中的内容并返回buff中现有数据量的大小并读取错误原因{DWORD dwError = 0;DWORD BytesRead = 0;ClearCommError(hComm, &dwError, &comstat);return comstat.cbInQue; //返回buff中数据量}/*串口数据接收读取函数*/void ReceiveChar(){BOOL bRead = TRUE;BOOL bResult = TRUE;DWORD dwError = 0;DWORD BytesRead = 0;char i=0,n;char RXBuff;j=0;while (i-n){n=i;Sleep(10);bResult = ClearCommError(hComm, &dwError, &comstat); i=(char)comstat.cbInQue;for (;i>0;i--){if (bRead)bResult = ReadFile(hComm, // Handle to COMM port &RXBuff, // RX Buffer Pointer1, // Read one byte&BytesRead, // Stores number of bytes read&m_ov); // pointer to the m_ov structure// printf("%c",RXBuff);cRecs[j++]=(char)RXBuff;if (!bResult){switch (dwError = GetLastError()){case ERROR_IO_PENDING:{bRead = FALSE;break;}default: break;}elsebRead = TRUE; // close if (bRead)if (!bRead){bRead = TRUE;bResult = GetOverlappedResult(hComm, // Handle to COMM port&m_ov, // Overlapped structure&BytesRead, // Stores number of bytes readTRUE); // Wait flag}}}bool WriteChar(char* m_szWriteBuffer,DWORD m_nToSend) //写字符的函数{BOOL bWrite = TRUE;BOOL bResult = TRUE;DWORD BytesSent = 0;HANDLE m_hWriteEvent;ResetEvent(m_hWriteEvent);if (bWrite){m_ov.Offset = 0;m_ov.OffsetHigh = 0;// Clear bufferbResult = WriteFile(hComm, // Handle to COMM Portm_szWriteBuffer, // Pointer to message buffer in calling finction m_nToSend, // Length of message to send&BytesSent, // Where to store the number of bytes sent&m_ov ); // Overlapped structureif (!bResult){DWORD dwError = GetLastError();switch (dwError){case ERROR_IO_PENDING:{// continue to GetOverlappedResults()BytesSent = 0;bWrite = FALSE;break;}default:// all other error codesbreak;}}} // end if(bWrite)if (!bWrite){bWrite = TRUE;bResult = GetOverlappedResult(hComm, // Handle to COMM port &m_ov, // Overlapped structure&BytesSent, // Stores number of bytes sentTRUE); // Wait flag// deal with the error codeif (!bResult){printf("GetOverlappedResults() in WriteFile()");}} // end if (!bWrite)// Verify that the data size send equals what we tried to send if (BytesSent != m_nToSend){printf("WARNING: WriteFile() error.. Bytes Sent: %d; Message Length: %d\n", BytesSent, strlen((char*)m_szWriteBuffer));}return true;}/*window时间函数回调*/void CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime){SYSTEMTIME time; //定义机构体变量timeGetLocalTime(&time); //取系统时间以指针方式TCHAR strTime[256]; //程序只有一个作用wsprintf(strTime,"%04d-%02d-%02d %02d:%02d:%02d",time.wYear, //就是读取系统时间time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);//然后写进strTimeSetDlgItemText(hwnd,IDC_TIME,strTime); //这个字符串}void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify){switch(id){case IDC_SEND:{GetDlgItemText (hwnd,IDC_EDIT2,cSends,sizeof(cSends)); unsigned n=sizeof(cSends); //n是通知串口将发送字节的长度char send[100];wsprintf (send,"%s",cSends);WriteChar(send,n-1);SetCommMask(hComm, EV_RXCHAR); //监视串口是否接收有数据ReceiveChar(); //读取串口sbuff中数据cRecs[j]='\0'; //将cRecs转为字符串SetDlgItemText(hwnd,IDC_EDIT1,cRecs);} break;/*case IDC_RECEIVE: //暂时未用采用直接显示的方式{}break;*/case IDC_CHECK:{int ctr;HWND hwndCombo1=GetDlgItem(hwnd,IDC_COMBO1);ctr = ComboBox_GetCurSel(hwndCombo1);switch (ctr){case 0:cCom="com1";break;case 1:cCom="com2";break;case 2:cCom="com3";break;case 3:cCom="com4";break;case 4:cCom="com5";break;default: cCom="com1";break;}if (openport(cCom)){ SetDlgItemText(hwnd,IDC_EDIT3,"OK !");MessageBox(hwnd,"串口打开成功!","",0); }elseSetDlgItemText(hwnd,IDC_EDIT3,"FAIL");if(setupdcb(9600)&&setuptimeout(1024,0,0,20,1000)) //初始化串口属性波特率9600SetDlgItemText(hwnd,IDC_EDIT4,"串口属性设置成功");elseSetDlgItemText(hwnd,IDC_EDIT4,"串口初始化失败!"); PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);}default:break;}}void Main_OnClose(HWND hwnd) {EndDialog(hwnd, 0);}。
comassistant串口调试助手使用说明
单片机多功能调试助手简介1简介图1单片机多功能调试助手单片机多功能调试助手一款集串口/USB/网络调试、进制转换、字模与数码管字型码制作、常用校验值计算、UNICODE码转换、位图输出C文件等众多功能于一身的综合型调试软件,最值得庆幸的是该软件会一直保持更新,并支持在线升级功能,这样大家手头上的单片机多功能调试助手总是最新的!单片机多功能调试助手与其他调试软件有什么优势:1)一直保持为单文件状态,不会因为需要保存配置信息而创建其他其他文件,所以该软件非常容易携带。
2)一直体贴着开发者,所有重要的配置在关闭该软件时将会得到保存,重启软件后会重新导入以前的配置信息,免去重复选择或填入数据的操作。
3)集成了串口/USB/网络调试功能,并在串口/USB/网络调试的过程中,该软件提供了监视和多项发送功能。
通过使用监视端口的功能就可以清晰地分辨出发送与接收的数据的顺序;通过使用多项发送功能就可以省去重复删除或填写待发送数据的步骤。
4)在线升级功能是该软件的最得意之处,理所当然地也是开发者最倍受关注的功能。
索取方式:发邮件到wenziqi@或wenziqi@。
2软件预览2.1串口调试图2-1-1串口调试主界面2.1.1串口监视图2-1-2串口监视器点击串口监视器界面的保存记录将会在“单片机多功能调试助手”的根目录生成“串口监视器.txt文件”,如图2-1-3。
图2-1-3串口监视器记录2.1.2多项发送图2-1-4串口多项发送界面2.2USB调试2-2-1USB调试界面2-2-2USB监视器2-2-3USB监视记录2.3网络调试图2-3-1网络调试界面2.3.1TCP监视图2-3-2TCP监视器界面图2-3-3TCP监视记录2.3.2UDP监视图2-3-5UDP监视器图2-3-6UDP监视记录2.4服务器调试图2-4-1服务器界面2.5小工具2-5-18051单片机波特率计算界面2.68051单片机波特率计算2-6-18051单片机波特率计算界面2.7ATMEGA16单片机波特率计算2-7-1ATMEGA16单片机波特率计算界面2.7校验值计算2-7-1校验值计算界面2.8UNICODE2-8-1UNICODE转换界面2.9BMP转C文件图2-9-1BMP2Hex界面图2-9-2BMP转C文件。
用C#在VS2010中开发串口工具时遇到的问题及解决方法
公司需要做一个串口调试软件,和普通的串口助手有些不同,在开发过程中遇到了一些问题,这个文档是问题和解决方法的总结,还有在解决问题时查询的一些知识性的东西,文档是笔记性质的,比较乱,希望对大家有帮助。
VS2010 尝试运行项目时出错:无法启动调试两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上。
2) 打开项目属性,选择调试选项卡,将“启用Visual Studio宿主进程“一项钩掉。
C#中在窗体1中单击按钮打开窗体2,出错原因是ob_FrmCom.show应该是大写的ob_FrmCom.Show误双击控件生成的代码如何删掉?双击错误列表的提示,跳转到窗体的定义文件中,只要将带蓝线的的那一整行删掉,然后保存生成一次就可以了!问题:Windows已在“xxx.exe”中触发了一个断点。
其原因可能是堆被破坏,这说明xxx.exe中或它所加载的任何DLL中有Bug。
原因也可能是用户在xxx.exe具有焦点时按下F12.输出窗口可能提供了更多诊断信息。
原因:1. 内存越界,比如“数组越界”、“释放已经释放掉的内存”、“共享内存引发的问题”、“释放野指针的问题”等。
2. 用到的第三方库版本不一致,比如“VS2010用到VS2013生成的DLL”、“Debug模式下用了Release模式下生成的库”、“代码生成中的MDD和MD”,可能还有其他第三方库的版本不一致问题。
如果之前没有这样的错误,突然出现了,很可能是你不小心delete了一个野指针。
vs2010C#编程中删除一个控件和相关的能看见的代码后出现错误:当前上下文中不存在名称"…"(控件名称)关闭解决方案后重新打开就好了.c#如何连接两个字符串用vs2005的c#写网页,我定义了两个字符串,一个是yy="2008",另一个是mm="10",如何把两个字符串连起来变成"200810"?如果是简单的连接的话,用+就可以了。
串口调试助手AccessPort(工具篇)
TivaC LP学习入门4—串口调试助手AccessPort(工具篇)在嵌入式系统的开发与调试中,串口是必不可少的一个调试工具。
在Windows XP操作系统里,系统自带的有超级终端。
但在Win7系统并没有自带串口调试终端,所以推荐个好用的串口工具,AcessPort。
1.下载官网链接:/cn/ap/download.htm百度网盘1.37版本:/s/13jrM02.安装该工具无需安装,只要解压即可使用。
3.使用说明(以下内容直接来自解压后,官方说明文档readme_zh_CN.txt)SUDT AccessPort 1.37 说明=====================在使用之前请仔细阅读本说明1.软件说明---------------------SUDT AccessPort 是一款用于PC机串口(RS232)调试、监控的软件。
特点:1).监控串口:具有端口监控功能,可以监控、拦截、保存所收发的数据(NT/2K/XP/Vista/Win7)。
2).串口调试:支持常用的串口操作功能,支持大数据量的收发、保存,支持自动发送。
3).动态变参:在不改变当前所打开端口的情况下,能动态改变端口参数(如:波特率、校验位、流控制等)。
4).双模编辑:数据发送区内嵌十六进制编辑器(类似UltraEdit),支持十六进制<=>文本双模式切换编辑,支持unicode。
5).国际版本:国际版,支持多国语言。
6).无需安装:界面友好,方便易用。
简要描述:1).用于串口调试,支持常用的110-256000波特率,支持自定义波特率。
2).能以字符或十六进制接收或发送任何数据,能发送、接收任意大小的文件。
3).在不改变当前所打开端口的情况下,能动态改变端口参数(如:波特率、校验位、流控制等)。
4).数据发送区可实时编辑、发送文本数据。
5).能将所接收的原始数据以及显示数据分别保存。
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兼容不是太好,有些小毛病,不过不影响编写。
模拟串口的三种方法及C语言
模拟串口的三种方法及C语言模拟串口是软件中模拟实现串口通信的一种方法,它是在电脑上通过软件模拟两个串口之间的传输,用来测试、调试串口相关的应用程序。
本文将介绍三种常见的模拟串口的方法,并提供C语言代码示例。
1.使用虚拟串口软件虚拟串口软件是一种用于模拟串口通信的应用程序。
它创建了虚拟的串口设备,使其在电脑上模拟出真实的串口通信环境。
通过虚拟串口软件,可以实现串口的模拟收发数据,可以连接到串口测试工具、串口调试工具或者自己编写的串口通信程序上。
以下是一个使用虚拟串口软件模拟串口通信的C语言代码示例:```c#include <stdio.h>#include <windows.h>int mai//打开虚拟串口//检测串口是否成功打开printf("Error in opening serial port\n");return 1;}//进行串口通信操作,如发送、接收数据//关闭串口return 0;```在这个示例中,我们使用了Windows操作系统的函数`CreateFile`来打开一个虚拟串口,这里的串口名称是"COM1"。
然后可以调用相关函数进行串口通信操作,最后用`CloseHandle`函数关闭串口。
2.使用串口驱动模拟在一些情况下,可以通过修改电脑的串口驱动程序来模拟串口通信。
这种方法需要更深入的了解操作系统的底层机制,并进行驱动程序的开发和修改。
通过修改串口驱动程序,可以模拟出一个虚拟的串口设备,通过这个设备进行串口通信。
以下是一个简单的C语言代码示例,用于修改串口驱动程序来模拟串口通信:```c#include <stdio.h>#include <fcntl.h>#include <unistd.h>int maiint fd;//打开串口设备fd = open("/dev/ttyS0", O_RDWR);//检测串口是否成功打开if (fd < 0)printf("Error in opening serial port\n");return 1;}//进行串口通信操作,如发送、接收数据//关闭串口设备close(fd);return 0;```在这个示例中,我们使用了Linux操作系统的函数`open`来打开一个串口设备,这里的设备名称是"/dev/ttyS0"。
串口调试助手源码
串口调试助手程序框架(一)【截图】【源码】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>。
串口调试助手三点零用户使用手册说明书
串口调试助手3.0版使用说明书WMD 工作室/目录串口调试助手3.0版 (1)使用说明书 (1)串口调试助手3.0版简介 (3)安装串口调试助手3.0版 (4)使用频道列表 (5)使用A频道 (6)使用B频道 (7)使用C频道 (8)使用D频道 ............................................................ 错误!未定义书签。
串口调试助手3.0版简介串口调试助手3.0版是WMD工作室最新研发的智能调试工具,是不折不扣的“串口助手”。
串口调试助手3.0版可以实现的功能包括发送接受16进制数、字符串、传输文件、搜索出空闲串口等,此外,还可以搜索用户自定义设置其他的项目。
为了让大家更好的使用串口调试助手3.0版将提供自动更新功能,用于免费升级软件以及修正bug.。
安装串口调试助手3.0版安装串口调试助手需要Windows2000/XP/2003/Vista操作系统中的任一种,Windows NT 4.0 下面没有测试过,不保证可运行。
串口调试助手为绿色软件,下载后只需要复制到硬盘上的指定目录中即安装完成。
因为要到网络上加查更新,如果您的计算机的安全防护软件提示,该程序需要访问网络的时候,建议选择“允许”访问。
使用列表软件安装完成后,直接双击“串口调试助手3.0”即可运行软件。
检查串口线是否连接到计算机和设备上。
如果2端都是本计算机上的串口,一定确认串口调试助手打开的是您指定的串口。
使用16进制调试使用16进制调试,您可以使用16进制调试串口的数据,用于检验其他软件的包文。
在左侧找到16进制显示的文字,并点击该复选框,图所示。
打开串口后接收到的信息即以16进制显示,同时发送的信息也按照16进制格式解析发送。
使用字符串收发如果您清除了16进制显示复选框,那么就进入ascii码传送方式。
该模式下,收到和发送的字符串将原本不变的显示与发送。
注:如果有非ascii码字符,可能不会正确显示。
串口调试助手
串口调试工具的使用1运行串口调试助手首先运行串口调试助手运行后界面图如下所示:图1-1 串口调试工具界面图2 串口调试助手的使用2.1串口调试助手基本参数的设置串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通行的端口,这些参数必须匹配:标题栏显示区调试区图2-1串口调试助手基本参数设置图(1)串口号软件启动后将自动识别所有可用的串口,您只需要在下拉框中选择即可。
如下图2-2所示,软件自动识别出COM3和COM4。
选择我们使用的串口COM4,点击“打开串口“按钮。
如果要使用另一个串口,请先单击”关闭串口“按钮,软件将显示串口已经关闭。
图2-3口号设置图(2)波特率它这是一个衡量通信速度的参数,表示每秒钟传送的bit的个数。
例如300波特表示每秒钟发送300个bit。
波特率和距离成反比,高波特率常常用于放置的很近的仪器间的通信。
我们常使用的波特率一般是9600和115200,我们这里选择波特率为9600。
图2-4波特率设置图(3)数据位这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不一定是8位的,标准的值是5、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII 码是0~127(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
图2-5数据位设置图(4)停止位停止位用于表示单个包的最后一位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
串口调试助手使用说明
串口调试助手使用说明为简单明了,有些不言自明的功能不作介绍。
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) 点击发送按钮。
串口助手步骤cjq
建立SCOMM程序串口助手背景:vc++2005,不需要什么特殊空间(spcomm之类的什么都不需要)1.打开vc++2005,新建MFC AppWizard,名字SCOMM,基于对话框的。
确定完成。
2.建立界面如下:代码如下:SCOMMDlg.cpp// SCOMMDlg.cpp : 实现文件//#include"stdafx.h"#include"SCOMM.h"#include"SCOMMDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的CAboutDlg 对话框class CAboutDlg : public CDialog{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()// CSCOMMDlg 对话框CSCOMMDlg::CSCOMMDlg(CWnd* pParent /*=NULL*/): CDialog(CSCOMMDlg::IDD, pParent), m_ReceiveData(_T("")), m_strSendData(_T("")){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//自己添加初始化变量值m_bAutoSend=FALSE;m_bStopDispRXData=FALSE;m_bOpenPort=FALSE;m_nCycleTime=1000;}void CSCOMMDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//接收区域DDX_Control(pDX, IDC_COMBO_COMSELECT, m_Com);DDX_Control(pDX, IDC_COMBO_SPEED, m_Speed);DDX_Control(pDX, IDC_COMBO_STOPBITS, m_StopBits);DDX_Control(pDX, IDC_COMBO_DATABITS, m_DataBits);DDX_Control(pDX, IDC_COMBO_PARITY, m_Parity);DDX_Control(pDX, IDC_BUTTON_STOPDISP, m_ctrlStopDisp);DDX_Control(pDX, IDC_CHECK_HEXRECIEVE, m_ctrlHexReceieve);DDX_Control(pDX, IDC_BUTTON_OPENPORT, m_ctrlOpenPort);DDX_Control(pDX, IDC_EDIT_RECIVE, m_ctrlReceiveData);DDX_Text(pDX, IDC_EDIT_RECIVE, m_ReceiveData);DDX_Control(pDX, IDC_CHECK_AUTOCLEAR, m_ctrlAutoClear);//2个计数的DDX_Control(pDX, IDC_STATIC_RXCOUNT, m_ctrlRXCOUNT);DDX_Control(pDX, IDC_STATIC_TXCOUNT, m_ctrlTXCount);DDX_Control(pDX, IDC_BUTTON_COUNTRESET, m_ctrlCounterReset);//清空计数//发送区域DDX_Control(pDX, IDC_BUTTON_MANUALSEND, m_ctrlManualSend);DDX_Control(pDX, IDC_CHECK_AUTOSEND, m_ctrlAutoSend);DDX_Control(pDX, IDC_CHECK_HEXSEND, m_ctrlHexSend);DDX_Control(pDX, IDC_EDIT_SEND, m_ctrlEditSend);DDX_Text(pDX, IDC_EDIT_SEND, m_strSendData);DDX_Control(pDX, IDC_BUTTON_CLEARRECASENDA, m_ctrlClearTXData);//关闭按钮DDX_Control(pDX, IDC_BUTTON_CLOSE, m_ctrlClose);DDX_Control(pDX, IDC_STATIC_STATUS, m_ctrlPortStatus);}BEGIN_MESSAGE_MAP(CSCOMMDlg, CDialog)ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)//自加的ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPON_BN_CLICKED(IDC_BUTTON_MANUALSEND,&CSCOMMDlg::OnBnClickedButtonManualsend)ON_BN_CLICKED(IDC_BUTTON_OPENPORT,&CSCOMMDlg::OnBnClickedButtonOpenport)ON_WM_DESTROY()ON_WM_TIMER()ON_BN_CLICKED(IDC_CHECK_AUTOSEND, &CSCOMMDlg::OnBnClickedCheckAutosend) ON_EN_CHANGE(IDC_EDIT_SEND, &CSCOMMDlg::OnEnChangeEditSend)ON_EN_CHANGE(IDC_EDIT_CYCLETIME, &CSCOMMDlg::OnEnChangeEditCycletime) ON_BN_CLICKED(IDC_BUTTON_CLEAR_RECI_AREA,&CSCOMMDlg::OnBnClickedButtonClearReciArea)ON_BN_CLICKED(IDC_BUTTON_STOPDISP,&CSCOMMDlg::OnBnClickedButtonStopdisp)//ON_CBN_SELCHANGE(IDC_COMBO_DATABITS,&CSCOMMDlg::OnCbnSelchangeComboDatabits)ON_CBN_SELENDOK(IDC_COMBO_COMSELECT,&CSCOMMDlg::OnCbnSelendokComboComselect)ON_CBN_SELENDOK(IDC_COMBO_SPEED, &CSCOMMDlg::OnCbnSelendokComboSpeed)ON_CBN_SELENDOK(IDC_COMBO_PARITY, &CSCOMMDlg::OnCbnSelendokComboParity)ON_CBN_SELENDOK(IDC_COMBO_DATABITS, &CSCOMMDlg::OnCbnSelendokComboDatabits) ON_CBN_SELENDOK(IDC_COMBO_STOPBITS, &CSCOMMDlg::OnCbnSelendokComboStopbits) ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CSCOMMDlg::OnBnClickedButtonClose)ON_BN_CLICKED(IDC_BUTTON_CLEARRECASENDA,&CSCOMMDlg::OnBnClickedButtonClearrecasenda)ON_BN_CLICKED(IDC_BUTTON_COUNTRESET,&CSCOMMDlg::OnBnClickedButtonCountreset)ON_BN_CLICKED(IDOK, &CSCOMMDlg::OnBnClickedOk)END_MESSAGE_MAP()// CSCOMMDlg 消息处理程序BOOL CSCOMMDlg::OnInitDialog(){CDialog::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。
c# winform 串口调试助手
c# winform 串口调试助手已调试通过,可以收发数据using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.IO.Ports;namespace CGF串?口ú助ú手?{publicpartialclass CgfForm1 : Form{public CgfForm1(){InitializeComponent();COMNUM.SelectedIndex = 2;BaudRate.SelectedIndex = 3;DataBit.SelectedIndex = 3;StopBit.SelectedIndex = 1;CheckBit.SelectedIndex = 0;CharDisp.Checked = true;SendChar.Checked = true;CloseComm.Enabled = false;DataSend.Enabled = false;}privatevoid label7_Click(object sender, EventArgs e){}privatevoid OpenComm_Click(object sender, EventArgs e){serialPort1.Close();serialPort1.PortName = COMNUM.Text;serialPort1.BaudRate = Convert.ToInt32(BaudRate.Text);serialPort1.DataBits = Convert.ToInt32(DataBit.Text);int SPnum = 4;SPnum = StopBit.SelectedIndex;switch (SPnum){case 0: serialPort1.StopBits = StopBits.None; break;case 1: serialPort1.StopBits = StopBits.One; break;case 2: serialPort1.StopBits = StopBits.OnePointFive; break;case 3: serialPort1.StopBits = StopBits.Two; break;default: break;}SPnum = CheckBit.SelectedIndex;switch (SPnum){case 0: serialPort1.Parity = Parity.None; break;case 1: serialPort1.Parity = Parity.Odd; break;case 2: serialPort1.Parity = Parity.Even; break;default: break;}/***************异皑?常£处鋦理え?!?****************/try{serialPort1.Open();}catch (Exception ex){MessageBox.Show("错洙?误ï:阰" + ex.Message);}/*****************************************/if (serialPort1.IsOpen){CloseComm.Enabled = true;DataSend.Enabled = true;OpenComm.Enabled = false;COMNUM.Enabled = false;BaudRate.Enabled = false;DataBit.Enabled = false;StopBit.Enabled = false;CheckBit.Enabled = false;}}privatevoid CloseComm_Click(object sender, EventArgs e){try{serialPort1.Close();CloseComm.Enabled = false;DataSend.Enabled = false;OpenComm.Enabled = true;COMNUM.Enabled = true;BaudRate.Enabled = true;DataBit.Enabled = true;StopBit.Enabled = true;CheckBit.Enabled = true;}catch (Exception ex){MessageBox.Show("错洙?误ï:阰" + ex.Message);CloseComm.Enabled = true;DataSend.Enabled = true;OpenComm.Enabled = false;COMNUM.Enabled = false;BaudRate.Enabled = false;DataBit.Enabled = false;StopBit.Enabled = false;CheckBit.Enabled = false;}}privatevoid DataSend_Click(object sender, EventArgs e){string InputString = SendBox.Text;/**********发ぁ?送íbyte[]实害?例 *********///byte[] SendBytes = new byte[]{0xff,0xe0,0xd0,0xc0,0xb0,0xa0,0x90,0x80,0x70,0x60}; //int DatasLength = SendBytes.Length;//serialPort1.Write(SendBytes, 0, DatasLength);/*******************************/if (SendChar.Checked == true) //以?字?符?形?式?发ぁ?送í,?直±接ï发ぁ?送í字?符?串?{labelTiShi.Text = "字?符?串?:阰" + InputString;try{char[] SendChars = InputString.ToCharArray();int CharsLength = SendChars.Length;serialPort1.Encoding = System.Text.Encoding.GetEncoding("GB2312"); //解a决?中D午?乱î码?问ê题琣,?国ú标括?312编括?码?格?式?serialPort1.Write(SendChars, 0, CharsLength);}catch (Exception ex){MessageBox.Show("错洙?误ï:阰" + ex.Message);}}else{if(SendHEX.Checked == true) //以?HEX形?式?发ぁ?送í,?输?入?范?围§:阰0~255,?即′0~FF。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 < len;k++){safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组}for(k = 0;k < len;k++) //将数组转换为Cstring型变量 {BYTE bt = *(char*)(rxdata+k); //字符型strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放m_strRXData += strtemp; //加入接收编辑框对应字符串}}UpdateData(FALSE); //更新编辑框内容(主要是接收编辑框中的)}到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。
没错吧?那么做下一步:6.打开串口和设置串口参数你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。
现在我们在主对话框的CSCommTestDlg::OnInitDialog()打开串口,加入如下代码:// TODO: Add extra initialization hereif (m_ctrlComm.GetPortOpen()){m_ctrlComm.SetPortOpen(FALSE);}m_ctrlComm.SetCommPort(4); //选择com4 我用的是笔记本用了个USB转串口的,所以是端口4if ( !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:表示以二进制方式检取数据//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件m_ctrlComm.SetRThreshold(1);m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0m_ctrlComm.GetInput(); //先预读缓冲区以清除残留数据7.发送数据先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码://此函数实现的就是串口的发送数据void CSCommTestDlg::OnButtonManualsend(){// TODO: Add your control notification handler code hereUpdateData(TRUE); //读取编辑框内容m_ctrlComm.SetOutput(COleVariant(m_strTXData)); //发送数据}运行程序,在发送编辑框中随意输入点什么,单击发送按钮,啊!看看,在和本机电脑用串口相连的另一电脑的串口调试助手接收框里就出现了所发送的数据。
当然也可以接收另外一台电脑发送过来的数据。
这是在前面的CSCommTestDlg::OnComm() 函数里头实现的。
8.发送十六进制字符在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND Caption: 十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend;在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码;//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔//如:A1 23 45 0B 00 29//CByteArray是一个动态字节数组,可参看MSDN帮助//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔//如:A1 23 45 0B 00 29//CByteArray是一个动态字节数组,可参看MSDN帮助int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata) {int hexdata,lowhexdata;int hexdatalen = 0;int len = str.GetLength();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;elsehexdata=hexdata*16+lowhexdata;i++;senddata[hexdatalen]=(char)hexdata;hexdatalen++;}senddata.SetSize(hexdatalen);return hexdatalen;}//这是一个将字符转换为相应的十六进制值的函数//好多C语言书上都可以找到//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1char 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;}elsereturn (-1);}再将CSCommTestDlg::OnButtonManualsend()修改成以下形式:void CSCommTestDlg::OnButtonManualsend(){// TODO: Add your control notification handler code here UpdateData(TRUE); //读取编辑框内容if(m_ctrlHexSend.GetCheck()){CByteArray hexdata;int len=String2Hex(m_strTXData,hexdata); //此处返回的len 可以用于计算发送了多少个十六进制数m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进}elsem_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据}现在,你先将串口线接好并打开串口调试助手V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00 01 02 03 A1 CC了。