MFC下串口编程使用最多的两种方法是读取注册表和使用mscomm组件,都有着或多或少的缺陷,调用系统SDK比较麻烦,而MSCOMm组件最多支持16个串口,串口号大于16的时候无法打开,遇到这种情况,可以使用一个名为pcommlite的串口通讯库,下载安装之后,解压出来的文件包括

根据编译的平台选择相应的lib文件加入工程,并加入pcomm.h文件

  1. 寻找系统串口,sio_open()打开串口 sio_close()关闭串口
  2. BYTE i = 0;
  3. CString str;
  4. // TODO: 在此添加控件通知处理程序代码
  5. ((CComboBox *)this->GetDlgItem(IDC_COMBO_Serial_Num_Select))->ResetContent();
  6. for (i = 0;i < 255;i++)
  7. {//此程序支持255个串口
  8. if(SIO_OK == sio_open(i))
  9. {
  10. sio_close(i);
  11. str.AppendFormat("COM%d",i);
  12. ((CComboBox *)GetDlgItem(IDC_COMBO_Serial_Num_Select))->AddString(str);
  13. str.Empty();
  14. }
  15. }
  16. i = ((CComboBox *)GetDlgItem(IDC_COMBO_Serial_Num_Select))->GetCount();
  17. if(i ==0)
  18. {
  19. GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(FALSE);
  20. }
  21. else
  22. {
  23. GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(TRUE);
  24. }

2.打开串口,各种库宏定义

switch(comBaud)

{

case 0:

m_comBaud = B1200;

break;

case 1:

m_comBaud = B2400;

break;

case 2:

m_comBaud = B4800;

break;

case 3:

m_comBaud = B9600;

break;

case 4:

m_comBaud = B19200;

break;

case 5:

m_comBaud = B38400;

break;

case 6:

m_comBaud = B57600;

break;

case 7:

m_comBaud = B115200;

break;

case 8:

m_comBaud = B230400;

break;

}

switch(comStopBit)

{

case 0:

m_comStopBit = STOP_1;

break;

case 1:

m_comStopBit = STOP_2;

break;

}

switch (comDataLength)

{

case 0:

m_comDataLength = BIT_5;

break;

case 1:

m_comDataLength = BIT_6;

break;

case 2:

m_comDataLength = BIT_7;

break;

case 3:

m_comDataLength = BIT_8;

break;

}

switch(comCheckSum)

{

case 0:

m_comChecksum = P_NONE;

break;

case 1:

m_comChecksum = P_ODD;

break;

case 2:

m_comChecksum = P_EVEN;

break;

}

config = m_comDataLength|m_comStopBit|m_comChecksum;

//开始串口配置

if( sio_open(m_comPort) != SIO_OK)

{

MessageBox("串口打开失败","提示",MB_OK);

this->serialsIsOpen = false;

m_comPort = 0;

return;

}

sio_flowctrl(m_comPort,0x00);//关闭硬件流控制

sio_lctrl(m_comPort,0x00);//关闭RTS DTR

sio_ioctl(m_comPort,m_comBaud,config);

sio_flush(m_comPort,2);

this->GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->SetWindowText("关闭串口");

GetDlgItem(IDC_COMBO_Serial_Num_Select)->EnableWindow(FALSE);

GetDlgItem(IDC_COMBO_Serial_Baud_Select)->EnableWindow(FALSE);

GetDlgItem(IDC_COMBO_Serial_Data_Select)->EnableWindow(FALSE);

GetDlgItem(IDC_COMBO_Serial_Parity_Select)->EnableWindow(FALSE);

GetDlgItem(IDC_COMBO_Serial_Stop_Select)->EnableWindow(FALSE);

this->serialsIsOpen = true;

}

3.串口发送数据 sio_lstatus() sio_write()

//检查串口是否打开,打开就发送

if(serialsIsOpen == true)

{

//变量打开了,要去测试串口状态

if(sio_lstatus(m_comPort)>= 0)

{

CString str1;

sendString.Empty();

//没有对\r\n特殊处理

((CEdit*)GetDlgItem(IDC_EDIT3))->GetWindowText(str1);

sendString.AppendFormat("%s",str1);

sio_write(m_comPort,sendString.GetBuffer(),sendString.GetLength());

}

else

{

//说明串口已经丢失

MessageBox("串口丢失,请关闭后重新打开","错误",MB_OK);

}

}

else

{

//说明串口已经丢失

MessageBox("请先打开串口","错误",MB_OK);

}

4.设定定时器,用于串口接收数据

5.在定时器中接收数据 sio_read()

void CLPC1768_PAD_OTG_DebugDlg::SerialsProcessBuffer( void )

{

serialReadTemp.Empty();

if(m_comPort > 0 && this->serialsIsOpen == true)

{

char readBuffer[1024] = {0};

//      sio_flush(m_comPort,1);

int length = sio_read(m_comPort,readBuffer,1024);

if(length > 0)

{

for(int i = 0; i < length; i++)

{

serialReadTemp.AppendChar(readBuffer[i]);

}

}

}

}

该库还有很多借口用于控制DTR RTS等,使用方便,详情查看帮助文档

pcommlite串口通讯库使用的更多相关文章

  1. Java利用Rxtx进行串口通讯

    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了.那么问题来了,如何进行串口通 ...

  2. delphi之动态库调用和串口通讯

    串口通讯: Spcomm 控件属性: CommName  :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...

  3. C# 串口操作系列(5)--通讯库雏形

    C# 串口操作系列(5)--通讯库雏形 标签: 通讯c#数据分析byteclassstring 2010-08-09 00:07 21378人阅读 评论(73) 收藏 举报  分类: 通讯类库设计(4 ...

  4. 树莓派中QT实现串口通讯

    树莓派中QT实现串口通讯 开发平台为QT 此博客QT使用的为WiringPi驱动 我使用的串口调试助手为 cutecom 先简单说一些开发过程中需要注意的问题 Linux 下设备为 tty ,对应在 ...

  5. .NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯,flyfire.CustomSerialPort 的使用

    目录 1,前言 2,安装虚拟串口软件 3,新建项目,加入 flyfire.CustomSerialPort 4,flyfire.CustomSerialPort 说明 5,开始使用 flyfire.C ...

  6. 详解linux下的串口通讯开发

    串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调 ...

  7. 使用Xamarin实现串口通讯

    前几天我写了年度总结,然后有人说让我教一下他Xamarin串口通讯怎么做,其实跟java没有多大区别. 记得我刚开始接到公司这个项目的时候很懵逼,我去看了别的安卓串口工具,都不行我当时是RS232串口 ...

  8. 具体解释linux下的串口通讯开发

    串行口是计算机一种经常使用的接口,具有连接线少.通讯简单,得到广泛的使用.经常使用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统. ...

  9. 第20章 USART—串口通讯

    本章参考资料:<STM32F76xxx参考手册>USART章节. 学习本章时,配合<STM32F76xxx参考手册>USART章节一起阅读,效果会更佳,特别是涉及到寄存器说明的 ...

随机推荐

  1. keyboardWillChangeFrameNotification 引发的思考 是的 思考了很久终于出结果

    func keyboardWillChangeFrameNotification(note: NSNotification) { // TODO 添加键盘弹出的事件 let userinfo = no ...

  2. 如何给grldr.mbr和grldr改名

    grldr修改方法: 比如要把grldr 改成gzldr :1.先把文件名改成gzldr:2.用ultraedit或winhex打开gzldr:3.虽然文本框全都是乱码,别管它,把光标定位在右边文本框 ...

  3. gameUnity 0.15 beta 网络游戏框架

    增加了 换人 和换衣服 ,加入了动画事件.beta版本 0.15测试版本 目前就到此,正式版本 会在7月底  和 0.2版本一起推出.届时,换装系统 将不仅仅是 换装备,而是有 换装后 打怪的体验,更 ...

  4. hdu - 2586 How far away ?(最短路共同祖先问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 最近公共祖先问题~~LAC离散算法 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起 ...

  5. TDK伪原创? 对matatags的研究总结

    /public_html/includes/modules/meta_tags.php 46行:switch ($_GET['main_page']) {这里面包括自定义页面index.php?mai ...

  6. Chapter 1 First Sight——18

    But at least he sent me to an empty desk at the back without introducing me to the class. 但是最后他给我最后面 ...

  7. MapReduce入门例子

    计算文档中不同单词的个数. hello you hello me 步骤如下:

  8. 查看光纤卡wwn号【转载】

    转自:查看光纤卡wwn号windows操作系统下_朝晖_新浪博客http://blog.sina.com.cn/s/blog_4ce992f40101dxyv.html 查看光纤卡wwn号window ...

  9. margin:0 auto在ie7浏览器里面无效

    把文件头改成 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w ...

  10. Bcdedit命令使用详解使用方法

    XP,WIN2003,VISTA,万indows,WIN2008多盘多系统多引导bcdedit的使用windows出了新系统vista,2008想赏赏鲜学习学习~~但又习惯于用旧的XP,2003,然而 ...