串口编程的方式有两种:一种MSCOMM控件;二种CSerialPort v1.21类.
1、MSCOMM控件实例
参考:http://dev.yesky.com/231/2309731_1.shtml
2、 CSerialPort v1.21类
参考:http://www.naughter.com/serialport.html
// 打印控制
BYTE* pBuf = new BYTE[1000];
memset(pBuf,0,1000);
try
{
COMMCONFIG config;
CSerialPort::GetDefaultConfig(1, config);
CSerialPort port;
port.Open(1, 9600, CSerialPort::NoParity, 8, CSerialPort::OneStopBit, CSerialPort::XonXoffFlowControl);
HANDLE hPort = port.Detach();
port.Attach(hPort);
DWORD dwModemStatus;
port.GetModemStatus(dwModemStatus);
DCB dcb;
port.GetState(dcb);
dcb.BaudRate = 9600;
port.SetState(dcb);
DWORD dwErrors;
port.ClearError(dwErrors);
port.SetBreak();
port.ClearBreak();
COMSTAT stat;
port.GetStatus(stat);
DWORD dwBytesWaiting = port.BytesWaiting();
dwBytesWaiting;
COMMTIMEOUTS timeouts;
port.GetTimeouts(timeouts);
port.Setup(1000, 1000);
port.GetConfig(config);
config.dcb.BaudRate = 9600;
port.SetConfig(config);
port.Set0WriteTimeout();
port.Set0ReadTimeout();
DWORD dwMask;
port.GetMask(dwMask);
port.SetMask(EV_TXEMPTY);
//port.WaitEvent(dwMask);
port.TerminateOutstandingWrites();
// port.TransmitChar('p');
port.Set0Timeout(); // 0超时
/*
// 1秒超时
COMMTIMEOUTS Timeouts;
GetTimeouts(Timeouts);
Timeouts.WriteTotalTimeoutMultiplier = 1000;
Timeouts.WriteTotalTimeoutConstant = 1000;
port.SetTimeouts(Timeouts);
*/
// 打印文本
str = "/x1bl/x1cK/x1bn/x1bQ225/x1bZ/x1b./x07/x1bj"; //初始化打印机信息
char sBuf[1000];
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
Sleep(2000);
// 读取返回值,判断是否处于OLIVETTI打印状态
char sRxBuf[10];
memset(sRxBuf,0,10);
port.Read(sRxBuf,10);
port.TerminateOutstandingReads();
int iQueryTime = 0;
while(!(sRxBuf[0]==27 && sRxBuf[1]==114 && sRxBuf[2]==80))
{
iQueryTime++;
if(iQueryTime<=3)
{
str = "/x1b/x30"; //总清,打印机软复位
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
str = "/x1bn/x1bQ225/x1bZ/x1b."; //初始化打印机
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
str = "/x1bj"; //查询状态
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
Sleep(1000);
// 读取返回值,判断是否处于OLIVETTI打印状态
memset(sRxBuf,0,10);
port.Read(sRxBuf,10);
port.TerminateOutstandingReads();
MessageBox("请放打印纸张!");
Sleep(2000);
}
else
{
MessageBox("请选择OLIVETTI PR2E打印机!");
str = "/x1b/x30"; //总清
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
str = "/x1b/x25/x41"; //置位PORT A [BP8901 默认为PORT A]
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
port.ClearDTR();
port.ClearRTS();
port.SetDTR();
port.SetRTS();
port.SetXOFF();
port.SetXON();
COMMPROP properties;
port.GetProperties(properties);
port.ClearWriteBuffer();
port.ClearReadBuffer();
port.Flush();
port.Close();
return;
}
}
str = "/x1c/x26"; //设置中西文兼容格式
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
str = "/x1bL015"; //绝对垂直位置
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
str = "/x1bH005"; //绝对水平位置
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
CString strText1 = "AAAAAAAAAAAAAAAAAAAAAAAA";
str = strText1;
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
str = "/x1bL016"; //绝对垂直位置
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
str = "/x1bH005"; //绝对水平位置
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
CString strText2 = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB";
str = strText2;
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
str = "/x1c/x2e"; //设置取消中西文兼容格式
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
str = "/x1bO"; //退纸
memset(sBuf,0,1000);
memcpy(sBuf,str.GetBuffer(str.GetLength()),str.GetLength());
port.Write(sBuf, (DWORD) strlen(sBuf));
port.ClearDTR();
port.ClearRTS();
port.SetDTR();
port.SetRTS();
port.SetXOFF();
port.SetXON();
COMMPROP properties;
port.GetProperties(properties);
port.ClearWriteBuffer();
port.ClearReadBuffer();
port.Flush();
port.Close();
}
catch (CSerialException* pEx)
{
TRACE(_T("Handle Exception, Message:%s/n"), pEx->GetErrorMessage());
pEx->Delete();
}
delete [] pBuf;
// 说明
/x1bl 清错
/x1bn/x1bQ080/x1bZ/x1b. 初始化打印机
/x1bj 主机询问打印机状态
/x07 声音提示
/x1b J004 设置左边界为4个字符
x1b&85 设置行距为85/240英寸或者85/216英寸
/x1b< 设置打印字距为10字符/英寸
/x1bUc 打印机进纸控制
// 串口调式工具下载:http://download.it168.com/07/0705/07051.shtml
SUDT SerialTrace 是一款用于侦听、拦截、记录、分析RS232/422/485串行接口通信协议的专业软件。它适用于串行口相关的软硬件开发、测试工程师。
SUDT SerialTrace 可以让您对串行口的命令和数据进行全方位的侦听、拦截、保存,为日后的数据导入、仿真、分析提供了便利。
SUDT SerialTrace 为用户提供了仿真功能,双击拦截到的读写数据,即可被自动复制到仿真终端的发送窗口,便于用户修改以及模拟测试。
SUDT SerialTrace 支持串行中继功能,利用计算机的两个串口分别与两台设备互联,可拦截两台设备间的通信信息。
SUDT SerialNull 是一款虚拟串口的专业配置工具,主要用于模拟RS232串口的虚拟连接,适用于串行口相关的软硬件开发、测试工程师。
SUDT SerialNull 可以在不占用真实串口的情况下,创建任意数量并互为连接的纯虚拟串口对。
SUDT SerialNull 在系统中所创建的虚拟串口在功能以及使用上与真实物理串口一致。
SUDT SerialRemap 是一款专业的串口映射(重定向)工具,允许将指定的物理串口或虚拟串口的数据映射(重定向)到本工具所创建的虚拟串口。例如:系统中存在com9 (该串口为物理串口或虚拟串口) ,但是串口应用程序仅支持com1-com4,此时可以使用SerialRemap创建一个端口号在com1-com4之间的虚拟串口,该虚拟串口会自动将数据映射(重定向)到com9。SerialRemap 在系统中所创建的虚拟串口在功能以及使用上与真实物理串口一致。
AccessPort 串口调试器(免费软件)
![]() |
强大的数据拦截功能 可以将指定端口的数据流、控制流信息拦截并保存下来,供分析之用。如察看端口状态的变化(波特率、数据位、校验位、停止位),拦截上行、下行的数据,处理速度快,拦截效率高。 |
![]() |
简单、易用的数据调试功能 简洁的界面布局,高度易用的设计,支持手动发送、自动发送、传输文件、后台接收数据等功能,各种操作一目了然。 |
![]() |
调试过程中可动态改变端口参数 在不改变当前端口的前提下,可以动态的修改指定参数,如:波特率、数据位、校验位、停止位、流控制等,增强了调试的灵活性。 |
![]() |
十六进制、字符形式--双模式切换功能 数据接收区、发送区都具有UtralEdit的双模式切换功能,便于数据的编辑以及显示,全面支持Unicode,解决了编辑和显示时十六进制、字符形式难于相互切换的难题。 |
![]() |
多国语言支持,国际版本 目前支持简体中文、繁体中文、英文三种语言,国际化的设计使得程序很容易实现语言本地化 |