不断读取串口MSComml.Input数据
mscomm控件的使用和安装
一、引言目前,在用计算机进行数据传输时,常用的是串行通信方式。
用C++Builder来编写串行通信程序时,可以调用Windows API函数,也可以利用VB中的MSComm控件。
利用API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难。
但是使用串行通信控件就相对简单一些,而且功能强大,性能安全可靠。
本文就简单的介绍一下在C++ Builder中利用MSComm 控件进行编程。
二、MSComm控件的常用属性和事件MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
事件驱动方式在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,MSComm控件将解发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。
这种方法的优点是程序响应及时,可靠性高。
查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
1.MSComm 控件的常用属性CommPort属性:设置或返回通讯端口号,可以设置为1到16之间的任何值,本系统采用缺省值2;Settings属性:以字符串形式设置或返回波特率、奇偶校验、数据位和停止位,本系统采用缺省值"9600,n,8,1";PortOpen属性:设置或返回通讯口的状态以及打开和关闭端口,可通过把该属性设置为true或者false来打开或者关闭端口;InBufferSize和OutBufferSize属性:分别设置接收和发送缓冲区分配的内存数量,单位为字节,缺省值分别为1024byte和512byte;InputLen属性:确定希望从接收缓冲区移出的字符数量,当InputLen=0时,一次把接收缓冲区的字符全部移出;Input属性:从接收缓冲区中读出数据,然后将该数据从缓冲区移走。
读取串口数据
读取串口数据方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。
此时,你只需要关心控件提供的对Windows 通讯驱动程序的 API 函数的接口。
换句话说,只需要设置和监视MSComm控件的属性和事件。
在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性: CommPort 设置并返回通讯端口号,缺省为COM1。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向发送缓冲区写一个字符串。
InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。
InBufferCount 返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。
InputMode 定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。
RThreshold 和 SThreshold 属性,表示在 OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。
以下是通过设置控件属性对串口进行初始化的实例:BOOL CSampleDlg:: PortOpen(){BOOL m_Opened;......m_Serial.SetCommPort(2); // 指定串口号m_Serial.SetSettings("4800,N,8,1"); // 通信参数设置m_Serial.SetInBufferSize(1024); // 指定接收缓冲区大小m_Serial.SetInBufferCount(0); // 清空接收缓冲区m_Serial.InputMode(1); // 设置数据获取方式m_Serial.SetInputLen(0); // 设置读取方式m_Opened=m_Serail.SetPortOpen(1); // 打开指定的串口return m_Opened;}打开所需串口后,需要考虑串口通信的时机。
C#串口通信:MSComm控件使用详解
C#串口通信:MSComm控件使用详解目次MSComm 控件两种处理通讯的方式CommPort 属性RThreshold 属性CTSHolding 属性SThreshold 属性CDHolding 属性DSRHolding 属性Settings 属性InputLen 属性EOFEnable 属性Handshake 常数OnComm 常数InputMode 常数错误消息MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi 等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者Carrier Detect (CD) 或Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。
串口通信MSComm控件和SerialPort
一.概述输送带控制模块的核心技术是与PLC的串口通讯,在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
但在技术广泛应用的今天,Visual S 没有将此控件加入控件库,所以人们采用了许多方法在Visual 来编写串口通讯程序:第一种方法是通过采用Visual Studio 6.0中原来的MSComm控件这是最简单的,最方便的方法,但需要注册;第二种方法是采用微软在.NET推出了一个串口控件,基于.NET的P/Invoke调用方法实现;第三种方法是自己用API写串口通信,虽然难度高,但可以方便实现自己想要的各种功能。
现在微软推出了最新版本的Visual Studio 2005开发工具,可以不再采用第三方控件的方法来设计串口通讯程序。
NET Framework 2.0类库包含了SerialPort类,方便地实现了所需要串口通讯的多种功能,为了使MSComm编程方法快速转换到以SerialPort类为核心的串口通讯的设计方法,这里着重讨论了Visual Studio 6.0的MSComm控件和SerialPort类设计方法的异同点。
二.SerialPort常用属性、方法和事件1.命名空间System.IO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步I/O 和事件驱动的I/ O、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入Using Sys tem.IO.Ports。
2.串口的通讯参数串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm 中相关的属性是CommPort和Settings。
SerialPort类与MSComm有一些区别:✍通讯端口号[PortName]属性获取或设置通信端口,包括但不限于所有可用的COM 端口,请注意该属性返回类型为String,不是mPort的short类型。
VB MSComm串口通讯处理奇偶校验异常
串口通讯时如果两台通讯设备奇偶校验不一致可能会出接收错误。
最近用VB编写上位机,发现当上位机设置为奇校验,下位机设置为无校验将会出现接收数据错误的情况。
最后调试发现,VB MSComm控件会自动处理奇偶校验异常,并将错误的值替换成ASCII?也就是0x63,举个例子。
当下位机发送2字节数据:0x100x12给上位机,这时由于奇偶校验异常,MSComm会发送0x630x630x100x124个字节数据给应用程序。
这个时候,如果应用程序没有处理奇偶校验异常,将会错误的将4个字节数据当成正确数据,从而出现通讯故障。
错误解决方法1.上位机识别奇偶校验异常然后进行纠正。
parity bit是指同一定数据位数一起传输的位,以提供简单的错误检查。
当使用校验位时,MSComm控件把在数据中已经设置的所有位(值为1)都加起来并检查其和为奇数或偶数(根据当端口开时奇偶校验的设置)。
按照缺省规定,MSComm控件用问号(?)替换非法字符。
若设置ParityReplace为一个空字符串(""),则当奇偶校验错误出现时,字符替换无效。
但OnComm事件仍然产生,并且设置CommEvent属性为comEventRXParity。
ParityReplace字符被用语面向字节的操作,它必须是单字节字符。
可指定0到255之间的任何ANSI字符代码。
数据类型Case comEvReceiveIf串口控制块_1.串口接收状态=True Then收到数据的长度=Form1.MSComm1.InBufferCountReDim收到的数据(收到数据的长度)收到的数据=Form1.MSComm1.InputCall数据接收(收到的数据,收到数据的长度,1)Else'清空BUFFER收到数据的长度=Form1.MSComm1.InBufferCount收到的数据=Form1.MSComm1.InputEnd IfCase comEventRxParityIf串口控制块_1.串口接收状态=True Then收到数据的长度=Form1.MSComm1.InBufferCountReDim收到的数据(收到数据的长度)收到的数据=Form1.MSComm1.InputElse'清空BUFFER收到数据的长度=Form1.MSComm1.InBufferCount收到的数据=Form1.MSComm1.InputEnd IfEnd Select上面代码的思路是:一旦MSComm控件接收到数据出现奇偶校验异常,将会产生comEventRxParity事件,并且将接收到的数据替换成0x63,但是正确的数据还会保存在MSComm的接收缓冲区中。
c 读取串口中大量数据的方法
c 读取串口中大量数据的方法在C语言中,读取串口中大量数据的方法主要依赖于操作系统的API。
下面是一种在Linux系统下使用termios API来读取串口中大量数据的方法。
首先,你需要包含一些必要的头文件:```cinclude <>include <>include <>include <>include <>include <>include <>```然后,你可以使用open函数打开串口:```cint fd = open("/dev/ttyS0", O_RDWR O_NOCTTY O_NDELAY);if (fd == -1) {perror("open_port: Unable to open /dev/ttyS0 - ");} else {fcntl(fd, F_SETFL, 0);}```接下来,你可以使用tcgetattr和tcsetattr函数来获取和设置串口的属性:```cstruct termios options;tcgetattr(fd, &options);// Set the speed of the serial portcfsetispeed(&options, B9600);cfsetospeed(&options, B9600);// Enable the receiver and set local mode_cflag = (CLOCAL CREAD);_cflag &= ~PARENB; // No parity bit_cflag &= ~CSTOPB; // 1 stop bit_cflag &= ~CSIZE; // clear data size bits_cflag = CS8; // set 8 data bits_lflag &= ~(ICANON ECHO ECHOE ISIG); // Raw input mode_iflag &= ~(IXON IXOFF IXANY); // Turn off s/w flow ctrl_oflag &= ~OPOST; // Prevent special interpretation of output fields ( newline chars)_cc[VMIN] = 1; // read at least 1 character from port when there is available data_cc[VTIME] = 0; // no timeout (wait forever)tcsetattr(fd, TCSANOW, &options);```现在你可以使用read函数来读取数据:```cchar buf[1024]; // 用于存储从串口读取的数据的缓冲区,你可以根据实际情况调整大小。
MSComm控件的用法和函数说明
MSComm控件进行串口编程步骤:1. 在建立的程序工程中插入MSComm控件。
2. 添加MSComm控件ID 的控制变量(或者对象)。
3. 对串口进行初始化,设置MSComm控件的属性。
4. 添加串口事件的消息处理函数OnComm()函数,在函数中根据应用需要,编写数据处理代码5. 编写串口发送等其他代码。
6. 关闭串口。
+MSComm控件常用属性:mPort:设置并返回通信端口号2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位3.PortOpen:设置并返回通信端口的状态。
也可以打开和关闭端口4.Input:从接收缓冲区返回和删除字符5.Output:向传输缓冲区写一个字符6.InputLen:设置并返回Input属性从接收缓冲区读取的字符数。
7.InBufferSize:设置或返回输入缓冲区的大小。
8.OutBufferSize:设置或返回输入缓冲区的大小。
9.InBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
10.OutBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
对MSComm控件通过Get/Set函数对来获取或设置控件的属性,每个属性均有与之对应的Get/Set函数对。
用法说明mPort:设置并返回通信端口号Void CMSComm::SetCommPort(short n); 设置串口号Short CMSComm::GetCommPort(); 查询当前串口号说明:n可以设置成1到16中的任何数(缺省值为1)。
但是,如果用PortOpen属性打开一个并不存在的端口是,MSComm控件会产生错误68(设备无效);必须在打开端口之前设置CommPort属性。
2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位Void CMSComm::SetSettings(LPCTSTR lpszNewValue);CString CMSComm::GetSettings();说明:当端口打开时,如果设置值lpszNewValue非法,则MSComm控件产生错误380(非法属性值)。
串口读取数据的方法
串口读取数据的方法1.打开串口:首先需要打开串口,通过设备文件或串口号来指定要打开的串口。
```c++#include <stdio.h>#include <fcntl.h>#include <termios.h>int openSerialPort(const char* portName)int fd = open(portName, O_RDWR , O_NOCTTY);if (fd < 0)printf("Failed to open serial port\n");return -1;}//配置串口参数struct termios options;tcgetattr(fd, &options);cfsetispeed(&options, B9600);cfsetospeed(&options, B9600);options.c_cflag ,= (CLOCAL , CREAD);tcsetattr(fd, TCSANOW, &options);return fd;}```2.读取串口数据:打开串口之后,可以通过读取文件描述符来读取串口数据。
```c++int readSerialData(int fd, unsigned char* buffer, int bufferSize)int bytesRead = read(fd, buffer, bufferSize);if (bytesRead < 0)printf("Failed to read serial data\n");}return bytesRead;}```3.解析串口数据:读取到的数据可能是原始的字节流,需要根据具体的协议和数据格式进行解析。
```c++void parseData(unsigned char* buffer, int bufferSize)//解析数据的逻辑}```4.循环读取数据:可以使用循环来不断读取串口数据,并进行解析和处理。
试谈读取串口数据
读取串口数据方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project -->Components and Control插入即可,再将该控件从工具箱中拉到对话框中。
此时,你只需要关心控件提供的对Windows 通讯驱动程序的 API函数的接口。
换句话说,只需要设置和监视MSComm控件的属性和事件。
在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm控件共有27个属性,这里只介绍其中几个常用属性:➢CommPort 设置并返回通讯端口号,缺省为COM1。
➢Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
➢PortOpen设置并返回通讯端口的状态,也可以打开和关闭端口。
➢Input 从接收缓冲区返回和删除字符。
➢Output 向发送缓冲区写一个字符串。
➢InputLen设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。
➢InBufferCount 返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。
➢InputMode 定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。
➢RThreshold和 SThreshold 属性,表示在 OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。
以下是通过设置控件属性对串口进行初始化的实例:BOOLCSampleDlg::PortOpen()ﻭ{ﻭm_Serial.SetCommPort(2); // 指定串口号ﻭm_SeriBOOL m_Opened;ﻭ......al.SetSettings("4800,N,8,1"); //通信参数设置ﻭm_Serial.SetInBufferSize(1024); // 指定接收缓冲区大小m_Serial.SetInBufferCount(0); // 清空接收缓冲区m_Serial.InputMode(1); // 设置数据获取方式m_Serial.SetInputLen(0); // 设置读取方式m_Opened=m_Serail.SetPortOpen(1); //打开指定的串口return m_Opened;ﻭ} ﻭ打开所需串口后,需要考虑串口通信的时机。
串口通信-MSComm控件使用详解
串口通信-MSComm控件使用详解2012-11-13 09:35 6988人阅读评论(0) 收藏举报控件编程 Delphi编程(13)MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
excel2013中读取串口数据的示例
excel2013中读取串口数据的示例首先,让我们了解一下串口数据是什么。
串口数据是通过串行端口(通常称为串口)发送和接收的数据。
串口通常用于连接计算机和外部设备,如传感器、打印机、鼠标等。
在科研和工程领域,我们经常需要从实验设备或传感器中读取数据,这就需要利用串口通信来实现数据传输。
在Excel 2013中读取串口数据可以通过两种方法来实现:通过VBA编程和使用第三方插件。
下面我们将分别介绍这两种方法。
方法一:使用VBA编程VBA(Visual Basic for Applications)是一种强大的编程语言,在Excel中可以通过编写VBA代码来实现串口数据读取。
以下是一个简单的VBA示例,演示了如何在Excel中读取串口数据:```vbaSub ReadSerialData()Dim serialPort As ObjectSet serialPort = CreateObject("MSCommLib.MSComm")' 设置串口参数With serialPort.CommPort = 1.Settings = "9600,n,8,1".InputMode = comInputModeText.PortOpen = TrueEnd With' 读取串口数据Dim data As Stringdata = serialPort.Input' 将数据写入Excel单元格Range("A1").Value = data' 关闭串口serialPort.PortOpen = FalseEnd Sub```在上面的示例中,我们首先创建了一个串口对象,并设置了串口的参数。
然后通过Input方法来读取串口数据,并将数据写入Excel单元格。
最后,记得关闭串口以释放资源。
方法二:使用第三方插件除了利用VBA编程,我们还可以使用第三方插件来实现串口数据读取。
利用注册表遍历COM口
利用注册表遍历COM口要得到当前计算机上可用的COM口列表,一般有两种方法,一是从COM1开始逐个试验,看能不能正常打开端口,另一种方法是读取注册表的某个键值,下文就介绍从注册表中获取可用COM口的列表的方法。
有关COM口的信息存储在HKEY_LOCAL_MACHINE下的HARDW ARE\\DEVICEMAP\\SERIALCOMM子键中,如果打开regedit可以看到这个子键下左侧有形如\Device\Serial0的设备列表,对应右侧显示其设备的名称,即COM1、COM2等。
我们要做的就是要遍历这个子键下的所有设备,取出他们的数据值。
#define MAX_VALUE_NAME 16383#define MAX_VALUE_LENGTH 1024//遍历COM口,输出到arrayComsvoid EnumComs(CStringArray& arrayComs){TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class nameDWORD cchClassName = MAX_PATH; // size of class stringDWORD cSubKeys=0; // number of subkeysDWORD cbMaxSubKey; // longest subkey sizeDWORD cchMaxClass; // longest class stringDWORD cValues; // number of values for keyDWORD cchMaxValue; // longest value nameDWORD cbMaxValueData; // longest value dataDWORD cbSecurityDescriptor; // size of security descriptorFILETIME ftLastWriteTime; // last write timeCString subKey= _T("HARDWARE\\DEVICEMAP\\SERIALCOMM");CString str;CString strValue;CStringArray arrayNames;HKEY hNewKey;long lResult;DWORD dwType;TCHAR achValue[MAX_VALUE_NAME];DWORD cchValue = MAX_VALUE_NAME;DWORD dwBufferSize = 10;TCHAR buffer[MAX_VALUE_LENGTH];//打开注册表lResult=RegOpenKeyEx( HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &hNewKey);if(lResult!=ERROR_SUCCESS){return;}//获取此子键的相关信息lResult = RegQueryInfoKey(hNewKey, // key handleachClass, // buffer for class name&cchClassName, // size of class stringNULL, // reserved&cSubKeys, // number of subkeys&cbMaxSubKey, // longest subkey size&cchMaxClass, // longest class string&cValues, // number of values for this key&cchMaxValue, // longest value name&cbMaxValueData, // longest value data&cbSecurityDescriptor, // security descriptor&ftLastWriteTime); // last write time//遍历此键下的参数名称if (cValues){for (DWORD i=0; i<cValues; i++){cchValue = MAX_VALUE_NAME;achValue[0] = '\0';lResult = RegEnumValue(hNewKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL);if (lResult == ERROR_SUCCESS ){arrayNames.Add(CString(achValue));}}}//获取对应参数的数值arrayComs.RemoveAll();for(int i=0;i<arrayNames.GetSize();i++){lResult= RegQueryValueEx( hNewKey, arrayNames[i], NULL, &dwType,(LPBYTE) buffer,&dwBufferSize );if(lResult == ERROR_SUCCESS ){arrayComs.Add(buffer);}}}在主函数中。
msm控件的用法和函数说明
MSComm控件进行串口编程步骤:1.在建立的程序工程中插入MSComm控件。
2.添加MSComm控件ID 的控制变量(或者对象)。
3.对串口进行初始化,设置MSComm控件的属性。
4.添加串口事件的消息处理函数OnComm()函数,在函数中根据应用需要,编写数据处理代码5.编写串口发送等其他代码。
6.关闭串口。
+MSComm控件常用属性:mPort:设置并返回通信端口号2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位3.PortOpen:设置并返回通信端口的状态。
也可以打开和关闭端口4.Input:从接收缓冲区返回和删除字符5.Output:向传输缓冲区写一个字符6.InputLen:设置并返回Input属性从接收缓冲区读取的字符数。
7.InBufferSize:设置或返回输入缓冲区的大小。
8.OutBufferSize:设置或返回输入缓冲区的大小。
9.InBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
10.OutBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
对MSComm控件通过Get/Set函数对来获取或设置控件的属性,每个属性均有与之对应的Get/Set函数对。
用法说明mPort:设置并返回通信端口号Void CMSComm::SetCommPort(short n);设置串口号Short CMSComm::GetCommPort();查询当前串口号说明:n可以设置成1到16中的任何数(缺省值为1)。
但是,如果用PortOpen属性打开一个并不存在的端口是,MSComm控件会产生错误68(设备无效);必须在打开端口之前设置CommPort属性。
2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位Void CMSComm::SetSettings(LPCTSTR lpszNewValue);CString CMSComm::GetSettings();说明:当端口打开时,如果设置值lpszNewValue非法,则MSComm控件产生错误380(非法属性值)。
毕业设计-VB中MSCOMM串行通信控件的使用方法
VB是Visual Basic的简称,是由美国微软公司于1991年开发的一种可视化的、面向对象和采用事件驱动方式级程序设计语言,可用于开发Windows 环境下的各类应用程序。
它简单易学、效率高,且功能强大可以与Windows 专业开发工具SDK相媲美。
在Visual Basic环境下,利用事件驱动的编程机制、新颖易用的可视化设计工具,使用Windows内部的广泛应用程序接口(API)函数,动态链接库(DLL)、对象的链接与嵌入(OLE)、开放式数据连接(ODBC)等技术,可以高效、快速地开发环境下功能强大、图形界面丰富的应用软件系统。
他的简单易学可以使我们快速实现自己想在Windows下的软件功能。
小则可以做计算器、上位机等符合自己需要的小软件;大则可以连接数据库做些管理系统,比如某公司的人事管理系统。
这里要说的是MSCOMM控件在VB中的使用方法。
MSComm 作为一个串行通讯控件为程序员串口通讯编程节省了很多时间。
在应用中加入一个MSComm控件非常简单。
在VB的常用控件里是没有MSCOMM控件的,我们可以通过工程部件勾取Microsoft comm control 6.0 来添加MSCOMM控件。
下面,让我们来了解其使用方法:1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与PC进行数据传输和通信的通道。
这些串口在CPU和外设之间充当解释器的角色。
当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个VB程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。
linux 读取串口数据方法
linux 读取串口数据方法【原创实用版2篇】目录(篇1)一、Linux 读取串口数据的方法概述二、使用 C 语言读取串口数据三、使用 Qt 库读取串口数据四、使用 Python 读取串口数据五、总结正文(篇1)一、Linux 读取串口数据的方法概述在 Linux 系统中,串口是一种常用的设备接口,可以用于接收和发送数据。
Linux 提供了多种方法来读取和操作串口数据。
本文将介绍几种常见的方法,包括使用 C 语言、Qt 库和 Python 语言来读取串口数据。
二、使用 C 语言读取串口数据1.打开串口在 C 语言中,打开串口需要使用 fcntl 函数。
首先,需要包含头文件<fcntl.h>和<termios.h>。
然后,使用以下代码打开串口:```cint fd = open("/dev/ttyS0", O_RDWR);if (fd < 0) {perror("Can"t Open Serial Port");return -1;}```2.设置串口速度打开串口成功后,需要设置串口的波特率、数据位、校验位和停止位等参数。
可以使用以下代码设置串口速度:```cstruct termios tty;if (tcgetattr(fd, &tty)!= 0) {perror("Can"t Get Serial Port Attributes");return -1;}tty.c_cflag &= ~PARENB; // 清除奇偶校验位tty.c_cflag &= ~CSTOPB; // 使用一个停止位tty.c_cflag |= CS8; // 8 位数据位tty.c_cflag &= ~CRTSCTS; // 禁用硬件流控制tty.c_cflag |= CREAD | CLOCAL; // 使能读和忽略 modem 控制线if (tcsetattr(fd, TCSANOW, &tty)!= 0) {perror("Can"t Set Serial Port Attributes");return -1;}```3.读取串口数据使用以下代码读取串口数据:char buf[64];int len = read(fd, buf, sizeof(buf));if (len < 0) {perror("Can"t Read from Serial Port");return -1;}printf("Read data: %s", buf);```三、使用 Qt 库读取串口数据在 Qt 中,可以使用 QSerialPort 类来读取串口数据。
用VB实现上位机与OMRONPLC串行通讯
上位机到 PLC 命令格式
4. 1 在 VB中添加控件
在窗体中添加 MSComm 控件 MSCommSet 和一 个时钟控件 Timerl,时钟控件用来处理通信超时。在 使用 MSComm 控件之前要进行初始化, 建立起与串 行端口的连接。在通信控件的属性页中设置其属性, 要保证和 PLC 通讯参数一致。
块。多点通信时,可作为单帧发送的最大数据块为
终止符— ——设置 “*” 和 “回车”(CHR
131 个字符,因此当一个数据块含有 132 或更多个 $(13))两个字符表明命令结束。当 PLC 收到上位
数据块时,要分成两帧或多帧发送。每个数据块都 机的命令后,会以下述格式应答。
以设备号及标题开始,以校验码(FCS)及结束符结 PLC到上位
2. 2 VB介绍
VISUAL BASIC 6.0 中提供了一种实现串口通 讯的 MSComm 控件。该控件可完成对串口的读写工 作,从而实现与 PLC 的通讯,为此需正确设置它的 一些属性。MSComm 控件的属性有许多,其中一些需 要在编程时设置,另一些则取默认值即可,具体置方 法可参见相关资料。MSComm 控件有两种通信方式, 查询方式和事件驱动方式。事件驱动法:OnComm 事 件是 MSComm 控件提供的唯一的事件, 当有数据到 达端口或端口状态发生改变或通信错误产生时,都 将触发 OnComm 事件, 以捕获和处理这些通信事件 和通信中产生的错误,通过查询 CommEvent 属性值,
2. 1 PLC介绍
OMRON 可编程控制器 SYSMAC CP1H 是最新 的超高速的一体化紧凑型 PLC。它整合了 CPM2A 和 CJ1 系列 PLC 的优点。内置数字 I/O、高速计数、 脉冲输出、模拟输入和输出功能,提供了极大的灵活 性。编程电缆只需要标准的 USB 线缆,使用快捷方 便。配备与 CS/CJ 系列共通的体系结构,与以往产品 CPM2A 40 点输入输出型尺寸相同,但处理速度可 达到约 10 倍的性能。CP1H PLC 提供了两个通讯口, 可 进 行 RS- 232C 通 信 和 RS- 422A/485 通 信 。 将 CPU 单元前面的拨动开关 SW4 (若选用串行端口 1)或者 SW5(若选用串行端口 2)设定为 OFF(出 厂时设定)。并且将串口设置中的模式设为 host link 模式。RS232 端口根据 PLC 系统设定的串行端口设 定的值进行动作。初始值:高位链接(9600 位 /s、启 动位 1 位、数据长 7 位、偶数校验、结束位 2 位)。
VB三种读取串口数据的方式
3三种读取串口数据的方式目前通用的串口通讯的软件实现方式有3种,本文都进行详细的介绍,它们各有自身的优缺点,读者在编程时可根据具体的情况选择合适的方式。
3.1利用Mscomm控件VB提供的这个通信控件“隐藏”了大部分串口通信的底层运行过程,程序员只需编写少量的代码就可以完成软件的开发过程。
在通信数据量不大,通信要求不是很高的情况下建议采取此方式。
利用Mscomm控件实现通信最需要掌握的就是它的几个主要属性,下面选取其中重要的进行介绍,其余的可以参考相关资料。
[3](1)Settings属性:以字符串的形式设置并返回波特率、奇偶校验位、数据位、停止位。
这个属性很重要,针对不同的终端设备需要根据设备的具体情况进行调整(比如日本的设备不同于美国的设备,通常会采用奇校验)。
(2)InputMode属性:设置接收数据的类型,0为文本格式,1为二进制格式。
(3)Input属性:读取并删除接收缓冲区中的数据流。
(4)Output属性:向发送缓冲区传送一数据流。
(5)Rthreshold属性:该属性为一阀值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件。
(6)Handshaking属性:设置和返回握手协议,即计算机内部CPU与串口之间的通讯协议,保证在缓冲区过载时数据不会丢失。
这个属性在保证数据传输的正确性方面有很大的作用,共有四个选项,分别表示:①无流控制;②软件流控制;③硬件流控制;④软硬件流控制。
采用硬件流控时,要求串口之间和电缆支持硬件握手,在自己制作串口通信线时,有关硬件握手的线RTS、CTS、DSR、DTR要连接正确。
在正确设置这些属性的基础上,剩下的就是打开串口,通过串口发送及接受数据了。
本文后续章节利用一个实例详细讲解了这些属性的设置及具体代码。
3.2直接调用Win32API通信函数直接调用Windows API函数,可以清楚地理解串口通信的机制,根据需要灵活地配置串口的各种参数和属性,而且直接调用低层API函数,通信效率比较高,但付出的代价就是程序较复杂,编程周期长,适合于大型通信程序及通讯质量要求较高的场合。
西门子—自由口通讯知识
S7-200系列自由口通讯的实现及应用1 引言为了达到和通讯协议已知的控制设备进行数据交换,以提高自动化控制系统的灵活性,很多plc制造商都相继的开发出了方便、灵活的自由口通讯方式,例如三菱公司的fx2系列plc,omron公司的cjm1系列的plc,西门子公司的s7-200系列plc等都提供了自由口通讯模式。
自由口通讯是指plc提供了串行的通讯硬件,和用于定制通讯协议的相关指令,在控制系统中,当要和plc连接的控制设备的通讯协议已知时,可以在plc中进行编程定制通讯协议,和控制设备进行数据通讯。
本文主要介绍西门子s7-200的自由口和计算机的串口进行的通讯,计算机中采用visual basic进行编程,从而实现计算机与可编程控制器的直接控制。
该通讯方式具有效率高、容易实现、通讯硬件简单、容易配置等特点在工业控制领域中被广泛应用。
2 s7-200通讯指令及特殊字节采用自由口通讯方式时,s7-200上的rs485口完全由用户控制,可以与任何协议已知的设备进行通讯,在这种情况下通讯协议完全由用户制定,为此,s7-200提供了用于进行通讯协议定制的特殊标志位以及相关的通讯指令。
2.1 特殊标志字节s7-200用于自由口通讯模式定义的特殊标志字节有smb30和smb130,smb30用于s7 -200的端口0的通讯,smb130用于s7-200的端口1的通讯,两者的格式一样,下面我们以smb130为例,介绍其组成。
smb130各位的含义如下:pp:两位用于选择通讯的校验方式当这两位的组合是:00无校验01 偶校验10 无校验11 奇校验d:这一位用于选择通讯的数据位数d=1时7个数据位,d=0时8个数据位bbb:用于选择自由口通讯是的波特率,这三位的组合和通讯波特率的关系如下:000 ——38400bps001 ——19200bps010 ——9600bps011 ——4800bps100 ——2400bps101 ——1200bps110 ——600 bps111 ——300 bpsmm: 用于通讯协议的选择,当这两位的组合是:00 ppi从站模式01 自由口通讯模式10 ppi主站模式2.2 接收信息的状态字节s7-200在自由口通讯时用于接受信息的状态有smb86和smb186,smb86用于s7-200的端口0的通讯,smb186用于s7-200的端口1的通讯,两者的格式一样,下面我们以s mb186为例,介绍其组成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ComEventFrame 1004 数据帧错误。硬件检测到一个数据帧错误
ComEventOverrun 1006 端口溢出。硬件中的字符尚未读,下一个字符又到达,并且丢失
mPort =2
'设定Com2
If MSComml.PortOpen = False Then
MSComm1.Settings = "9600,n,8,1"
'9600波特率,无校验,8位数据位,1位停止位
MSComm1.PortOpen = True
'打开串口
End if
ComEventCDTO 1007 Carrier Detect Time。在发送字符时,在系统指定的事件内,CD(Carrier Detect)线是低电平。CD也称为RLSD(Receive Line Singal Detect,接收线信号检测)
ComEventRxOver 1008 接收缓冲区溢出。在接收缓冲区中没有空间
ComEventDSRTO 1003 Data Set Ready Timeout。在发送字符时,在系统指定的事件内,DSR(Data Set Ready)线是低电平
ComEventFrame 1004 数据帧错误。硬件检测到一个数据帧错误
ComEventOverrun 1006 端口溢出。硬件中的字符尚未读,下一个字符又到达,并且丢失
ComEventRxParity 1009 奇偶校验错。硬件检测到奇偶校验错误7
ComEventTxFull 1010 发送缓冲区满。在对发送字符排队时,发送缓冲区满
ComEventDCB 1011 检取端口DCB(Device Control Blick)时发生了没有预料到的错误
'打开串口
Output 将字符串写入发送缓冲区
CommEvent属性为通信事件或错误返回下列值之一。在该控件的对象库中也可以找到这些常量。
常量 值 描述
ComEventBreak 1001 收到了断开信号
ComEventCTSTO 1002 Clear To Send Timeout。在发送字符时,在系统指定的事1件内,CTS(Clear To Send)线是低电平
Output 将字符串写入发送缓冲区
CommEvent属性为通信事件或错误返回下列值之一。在该控件的对象库中也可以找到这些常量。
常量 值 描述
ComEventBreak 1001 收到了断开信号
ComEventCTSTO 1002 Clear To Send Timeout。在发送字符时,在系统指定的事1件内,CTS(Clear To Send)线是低电平
ComEventCDTO 1007 Carrier Detect Time。在发送字符时,在系统指定的事件内,CD(Carrier Detect)线是低电平。CD也称为RLSD(Receive Line Singal Detect,接收线信号检测)
ComEventRxOver 1008 接收缓冲区溢出。在接收缓冲区中没有空间
使用Mscomm控件,不断读取串口MSComml.Input数据。
属性 描述
CommPort 设置或返回通信端口号
Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位
PortOpen 设置或返回通信端口的状态。也可以打开和关
'打开串口
End if
MSComm1.OutBufferCount = 0
'清空发送缓冲区
MSComm1.InBufferCount = 0
'滑空接收缓冲区
'接收二进制数据
MSComm1.InputMode= ComInputModeBinary
Buffer=MSComm1.Input
Buffer = MSComml.Input
Mscomm控件
属性 描述
CommPort 设置或返回通信端口号
Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位
PortOpen 设置或返回通信端口的状态。也可以打开和关闭端口
Input 返回和删除接收缓冲区中的字符
ComEventRxParity 1009 奇偶校验错。硬件检测到奇偶校验错误7
ComEventTxFull 1010 发送缓冲区满。在对发送字符排队时,发送缓冲区满
ComEventDCB 1011 检取端口DCB(Device Control Blick)时发生了没有预料到的错误
'打开串口
MSComm1.OutBufferCount = 0
'清空发送缓冲区
MSComm1.InBufferCount = 0
'滑空接收缓冲区
'接收二进制数据
MSComm1.InputMode= ComInputModeBinary
Buffer=MSComm1.Input
'接收字符数据
MSComm1.InputMode=comInputModeText
mPort =2
'设定Com2
If MSComml.PortOpen = False Then
MSComm1.Settings = "9600,n,8,1"
'9600波特率,无校验,8位数据位,1位停止位
MSComm1.PortOpen = True '(打开串口)-----------------------MSComm1.PortOpen=False'(关闭串口)
'接收字符数据
MSComm1.InputMode=comInputModeText
Buffer = MSComml.Input