文档库 最新最全的文档下载
当前位置:文档库 › WIN_API串口通信详细讲解带范例程序说明

WIN_API串口通信详细讲解带范例程序说明

WIN_API串口通信详细讲解带范例程序说明
WIN_API串口通信详细讲解带范例程序说明

WIN32 API串口通讯实例教程

第一节实现串口通讯的函数及串口编程简介

API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。常用函数及作用下:

函数名作用

CreateFile 打开串口

GetCommState 检测串口设置

SetCommState 设置串口

BuilderCommDCB 用字符串中的值来填充设备控制块

GetCommTimeouts 检测通信超时设置

SetCommTimeouts 设置通信超时参数

SetCommMask 设定被监控事件

WaitCommEvent 等待被监控事件发生

WaitForMultipleObjects 等待多个被监测对象的结果

WriteFile 发送数据

ReadFile 接收数据

GetOverlappedResult 返回最后重叠(异步)操作结果

PurgeComm 清空串口缓冲区,退出所有相关操作

ClearCommError 更新串口状态结构体,并清除所有串口硬件错误

CloseHandle 关闭串行口

用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高。

API编写串口,过程一般是这样的:

1、创建串口句柄,用CreateFile;

2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port);

3、然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数;

4、读写结束后,要关闭串口句柄,用CloseFile。

下面依次讲述各个步骤的过程。

第二节创建串口句柄打开串口

从字面上去理解,大家也可以发现CreateFile实际上表明Windows是把串口当作一个文件来处理的,所以它也有文件那样的缓冲区、句柄、读写错误等,不同的是,这个文件名字只有固定的几个(一般为四个),而且始终存在(EXSITING),而且在调用CreateFile的时候请注意它的参数。CreateFile函数原型如下:

HANDLE CreateFile(LPCTSTR lpFileName,

DWORD dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

DWORD dwCreationDisposition,

DWORD dwFlagsAndAttributes,

HANDLE hTemplateFile );

lpFileName:指向一个以NULL结束的字符串,该串指定了要创建、打开或截断的文件、管道、通信源、磁盘设备或控制台的名字。当用CreateFile打开串口时,这个参数可用“COM1”指定串口1,用“COM2”指定串口2,依此类推。

dwDesireAccess:指定对文件访问的类型,该参数可以为GENERIC_READ(指定对该文件的读访问权)或GENERIC_WRITE(指定该文件的写访问权)两个值之一或同时为为这两个值。用ENERIC_READ|GENERIC_WRITE则指定可对串口进行读写;

dwShareMode:指定此文件可以怎样被共享。因为串行口不支持任何共享模式,所以dwShareMode必须设为0;

lpSecurityAttributes定义安全属性,一般不用,可设为NULL。Win 9x下该参数被忽略;

dwCreationDistribution定义文件创建方式,对串口必须设为OPEN_EXISTING,表示打开已经存在的文件;

dwFlagsAndAttributes为该文件指定定义文件属性和标志,这个程序中设为FILE_FLAG_OVERLAPPED,表示异步通信方式;

hTemplateFile 指向一个模板文件的句柄,串口无模板可言,设为NULL。在 Windows 9x 下该参数必须为NULL。

串口被成功打开时,返回其句柄,否则返回INVALID_HANDLE_value(0XFFFFFFFF)。

上面说到了异步,那什么是异步呢?异步是相对同步这个概念而言的。异步,就是说,在进行串口读写操作时,不用等到I/O操作完成后函数才返回,也就是说,异步可以更快得响应用户操作;同步,相反,响应的I/O操作必须完成后函数才返回,否则阻塞线程。对于一些很简单的通讯程序来说,可以选择同步,这样可以省去很多错误检查,但是对于复杂一点的应用程序,异步是最佳选择。

实例1:

/****************** example1.cpp ******************************************/ /* lishaoan 2009-06-29 *****************************************************/ /* ******************************************************/

#include

#include

#include

bool openport(char *portname)//打开串口

{

HANDLE hComm;

hComm = CreateFile(portname, //串口号

GENERIC_READ | GENERIC_WRITE, //允许读写

0, //通讯设备必须以独占方式打开

0, //无安全属性

OPEN_EXISTING, //通讯设备已存在

FILE_FLAG_OVERLAPPED, //异步I/O

0); //通讯设备不能用模板打开

if (hComm == INVALID_HANDLE_VALUE)

{

CloseHandle(hComm);

return FALSE;

}

else

return true;

}

void main()

{

bool open;

open=openport("com2");

if(open)

printf("open comport success");

system("pause") ;

}

/************************** program end***************************************/

实例2:

/****************** example2.cpp ******************************************/ /* lishaoan 2009-06-29 *****************************************************/ /* ******************************************************/

#include

#include

#include

bool openport(char *portname)//打开串口

{

HANDLE hComm;

hComm = CreateFile(portname, //串口号

GENERIC_READ | GENERIC_WRITE, //允许读写

0, //通讯设备必须以独占方式打开

0, //无安全属性

OPEN_EXISTING, //通讯设备已存在

0, //同步I/O

0); //通讯设备不能用模板打开

if (hComm == INVALID_HANDLE_VALUE)

{

CloseHandle(hComm);

return FALSE;

}

else

return true;

}

void main()

{

bool open;

open=openport("com2");

if(open)

printf("open comport success");

system("pause") ;

}

/************************** program end***************************************/

第三节设置串口

在打开通信设备句柄后,常常需要对串行口进行一些初始化工作。这需要通过一个DCB 结构来进行。DCB结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。

第一次打开串口时,串口设置为系统默认值,函数GetCommState和SetCommState可用于检索和设定端口设置的DCB(设备控制块)结构,该结构中BaudRate、ByteSize、StopBits 和Parity字段含有串口波特率、数据位数、停止位和奇偶校验控制等信息。

程序中用DCB进行串口设置时,应先调用API函数GetCommState,来获得串口的设置信息:

GetCommState()

用途:取得串口当前状态

原型:BOOL GetCommState(HANDLE hFile, LPDCB lpDCB);

参数说明:

-hFile:串口句柄

-lpDCB:设备控制块(Device Control Block)结构地址。此结构中含有和设备相关的参数。此处是与串口相关的参数。由于参数非常多,当需要设置串口参数时,通常是先取得串口的参数结构,修改部分参数后再将参数结构写入。

然后在需要设置的地方对dcb进行设置。串口有很多的属性,上面也已经介绍了一些最重要的参数。这里介绍数据结构DCB:

typedef struct _DCB { // dcb

DWORD DCBlength; //DCB结构体大小

DWORD BaudRate; //波特率

DWORD fBinary: 1; //是否是二进制,一般设置为TRUE

DWORD fParity: 1;//是否进行奇偶校验

DWORD fOutxCtsFlow:1; //CTS线上的硬件握手

DWORD fOutxDsrFlow:1; //DSR线上的硬件握手

DWORD fDtrControl:2; //DTR控制

DWORD fDsrSensitivity:1; // DSR sensitivity

DWORD fTXContinueOnXoff:1; // XOFF continues Tx

DWORD fOutX: 1; //是否使用XON/XOFF协议

DWORD fInX: 1; //是否使用XON/XOFF协议

DWORD fErrorChar: 1; //发送错误协议

DWORD fNull: 1; // enable null stripping

DWORD fRtsControl:2; // RTS flow control

DWORD fAbortOnError:1; // abort reads/writes on error

DWORD fDummy2:17; // reserved

WORD wReserved; // not currently used

WORD XonLim; //设置在XON字符发送之前inbuf中允许的最少字节数

WORD XoffLim; //在发送XOFF字符之前outbuf中允许的最多字节数

BYTE ByteSize; //数据宽度,一般为8,有时候为7

BYTE Parity; //奇偶校验

BYTE StopBits; //停止位数

char XonChar; //设置表示XON字符的字符,一般是采用0x11这个数值

char XoffChar; //设置表示XOFF字符的字符,一般是采用0x13这个数值

char ErrorChar; // error replacement character

char EofChar; // end of input character

char EvtChar; // received event character

WORD wReserved1; // reserved; do not use

} DCB;

我们真正在串口编程中用到的数据成员没有几个,在此仅介绍少数的几个常用的参数:DWORD BaudRate:串口波特率

DWORD fParity:为1的话激活奇偶校验检查

DWORD Parity:校验方式,值0~4分别对应无校验、奇校验、偶校验、校验置位、校验清零

DWORD ByteSize:一个字节的数据位个数,范围是5~8

DWORD StopBits:停止位个数,0~2分别对应1位、1.5位、2位停止位

然后再末尾调用SetCommState就可以了,还是比较方便的。这样可不必构造一个完整的DCB结构。

SetCommState()

用途:设置串口状态,包括常用的更改串口号、波特率、奇偶校验方式、数据位数等原型:BOOL SetCommState(HANDLE hFile, LPDCB lpDCB);

参数说明:

-hFile:串口句柄

-lpDCB:设备控制块(Device Control Block)结构地址。要更改的串口参数包含在此结构中。

然后调用SetCommMask,用来指定程序接收特定的串口事件,调用SetupComm函数,设置串口缓冲区大小:

SetCommMask()说明:

用途:设置串口通信事件。

原型:BOOL SetCommMask(HANDLE hFile,

DWORD dwEvtMask

);

参数说明:

-hFile:串口句柄

-dwEvtMask:准备监视的串口事件掩码

该参数有如下信息掩码位值:

EV_BREAK:收到BREAK信号

EV_CTS:CTS(clear to send)线路发生变化

EV_DSR:DST(Data Set Ready)线路发生变化

EV_ERR:线路状态错误,包括了CE_FRAME\CE_OVERRUN\CE_RXPARITY 3钟错误。

EV_RING:检测到振铃信号。

EV_RLSD:CD(Carrier Detect)线路信号发生变化。

EV_RXCHAR:输入缓冲区中已收到数据。

EV_RXFLAG:使用SetCommState()函数设置的DCB结构中的等待字符已被传入输入缓冲区中。

EV_TXEMPTY:输出缓冲区中的数据已被完全送出。

还有,串口因为是I/O操作,可能会产生错误,这时候需要用SetCommTimeouts()设置超时限制,以避免阻塞现象。设置超时设置需要一个结构体COMMTIMEOUTS。

SetCommTimeouts()

BOOL SetCommTimeouts( hCommDev, lpctmo );

Lpctmo指向包含新的超时参数的COMMTIMEOUTS结构。

COMMTIMEOUTS结构定义如下:

typedef struct _ COMMTIMEOUTS{

DWORD ReadIntervalTimeout;

DWORD ReadTotalTimeoutMultiplier;

DWORD ReadTotalTimeoutconstant;

DWORD WriteTotalTimeoutMultiplier;

DWORD WriteTotalTimeoutconstant;

}COMMTIMEOUTS, LPCOMMTIMEOUTS;

ReadIntervalTimeout:以毫秒为单位指定通信线上两个字符到达之间的最大时间。在ReadFile操作其间,收到第一个字符时开始计算时间。若任意两个字符到达之间的间隔超过这个最大值,ReadFile操作完成,返回缓冲数据。0值表示不用间隔限时。若该成员为MAXDWORD,且ReadTotalTimeoutconstant和ReadTotalTimeoutMultiplier成员为零,则指出读操作要立即返回已接收到的字符,即使未收到字符,读操作也要返回。

ReadTotalTimeoutMultiplier:以毫秒为单位指定一个乘数,该乘数用来计算读操作的总限时时间。每个读操作的总限时时间等于读操作所需的字节数与该值的乘积。

ReadTotalTimeoutConstant:以毫秒为单位指定一个常数,用于计算读操作的总限时时间。每个操作的总限时时间等于ReadTotalTimeoutMultiplier成员乘以读操作所需字节数再加上该值的和。ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant成员的值为0表示读操作不使用限时时间。

WriteTotalTimeoutMultiplier和WriteTotalTimeoutconstant的意义和作用分别与ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant相似,不再重复。

举例:

COMMTIMEOUTS timeouts;

timeouts.ReadIntervalTimeout=MAXDWORD;

timeouts.ReadTotalTimeoutConstant=0;

timeouts.ReadTotalTimeoutMultiplier=0;

timeouts.WriteTotalTimeoutConstant=50;

timeouts.WriteTotalTimeoutMultiplier=2000;

SetCommTimeouts(m_hCom, &timeouts);

这里将ReadIntervalTimeout设置为最大字节数,.ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier都设置为0,表示不设置读操作超时,也就是说读操作瞬间完成,不进行等待。

调用PurgeComm函数可以终止正在进行的读写操作,该函数还会清除输入或输出缓冲区中的内容。

PurgeComm()说明:

功能:终止目前正在进行的读或写的动作

函数原型:BOOL PurgeComm(

HANDLE hFile, // handle of communications resource

DWORD dwFlags // action to perform

);

参数说明:

HANDLE hFile,//串口名称字符串

dwFlags 共有四种 flags:

PURGE_TXABORT: 终止目前正在进行的(背景)写入动作

PURGE_RXABORT: 终正目前正在进行的(背景)读取动作

PURGE_TXCLEAR: flush 写入的 buffer

PURGE_TXCLEAR: flush 读取的 buffer

实例3:

/****************** example3.cpp ******************************************/ /* lishaoan 2009-06-29 *****************************************************/ /* ******************************************************/

#include

#include

#include

bool openport(char *portname)//打开串口

{

HANDLE hComm;

hComm = CreateFile(portname, //串口号

GENERIC_READ | GENERIC_WRITE, //允许读写

0, //通讯设备必须以独占方式打开

0, //无安全属性

OPEN_EXISTING, //通讯设备已存在

0, //同步I/O

0); //通讯设备不能用模板打开

if (hComm == INVALID_HANDLE_VALUE)

{

CloseHandle(hComm);

return FALSE;

}

else

return true;

}

bool setupdcb(int rate_arg)//设置DCB,先获取DCB配置,再设置,最后看是否设置

//好

{

DCB dcb;

int rate= rate_arg;

memset(&dcb,0,sizeof(dcb));//在一段内存块中填充某个给定的值,是对较大的结构

//体或数组进行清零操作的一种最快方法 if(!GetCommState(hComm,&dcb))//获取当前DCB配置

return FALSE;

// set DCB to configure the serial port

dcb.DCBlength = sizeof(dcb);

/* ---------- Serial Port Config ------- */

dcb.BaudRate = rate;

dcb.Parity = NOPARITY;

dcb.fParity = 0;

dcb.StopBits = ONESTOPBIT;

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;

/* ----------------- misc parameters ----- */

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 DCB

if(!SetCommState(hComm,&dcb))

return false;

else

return true;

}

bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD ReadTotalconstant,DWORD WriteTotalMultiplier,DWORD WriteTotalconstant) {

COMMTIMEOUTS timeouts;

timeouts.ReadIntervalTimeout=ReadInterval;

timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;

timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier;

timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;

timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;

if(!SetCommTimeouts(hComm, &timeouts))

return false;

else

return true;

}

void main()

{

bool open;

open=openport("com2");

if(open)

printf("open comport success");

if(setupdcb(9600))

printf("setupDCB success\n");

if(setuptimeout(0,0,0,0,0))

printf("setuptimeout success\n");

SetCommMask(hComm, EV_RXCHAR); //当有字符在inbuf中时产生这个事件

//清除串口的所有操作

PurgeComm(hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);

system("pause") ;

}

/************************** program end***************************************/

第四节读写串口数据及关闭串口

Win32API函数ReadFile和WriteFile支持对串行口的读写操作。在调用ReadFile和WriteFile之前,线程应该调用ClearCommError函数清除错误标志。

该函数负责报告指定的错误和设备的当前状态。

ClearCommError()

用途:清除串口错误或者读取串口现在的状态

原型:BOOL ClearCommError(HANDLE hFile,

LPDWORD lpErrors,

LPCOMATAT lpStat

);

参数说明:

-hFile:串口句柄

-lpErrors:返回错误数值,错误常数如下:

1-CE_BREAK:检测到中断信号。意思是说检测到某个字节数据缺少合法的停止位。

2-CE_FRAME:硬件检测到帧错误。

3-CE_IOE:通信设备发生输入/输出错误。

4-CE_MODE:设置模式错误,或是hFile值错误。

5-CE_OVERRUN:溢出错误,缓冲区容量不足,数据将丢失。

6-CE_RXOVER:溢出错误。

7-CE_RXPARITY:硬件检查到校验位错误。

8-CE_TXFULL:发送缓冲区已满。

-lpStat:指向通信端口状态的结构变量,原型如下:

typedef struct _COMSTAT{

...

...

DWORD cbInQue; //输入缓冲区中的字节数

DWORD cbOutQue;//输出缓冲区中的字节数

}COMSTAT,*LPCOMSTAT;

该结构中对我们很重要的只有上面两个参数,其他的我们可以不用管。

假如当前串口中有5个字节数据的话,那么执行完ClearCommError()函数后,ComStat 结构中的ComStat.cbInQue将被填充为5,此值在ReadFile函数中可被直接利用。

例如:

COMSTAT ComStat;

DWORD dwError=0;

ClearCommError(hComm,&dwError,&ComStat);

上式执行完后,ComStat.cbInQue就是串口中当前含有的数据字节个数,我们利用此

数值就可以用ReadFile()函数去读串口中的数据了。

函数ReadFile和WriteFile的行为还受是否使用异步I/O(Overlapped)及通信超时设置的影响。串行口读写的同步、异步方式是在打开端口的同时给dwGlagsAndAttributes参数

传入适当的值而设定的。

WriteFile()

用途:向串口写数据

原型:BOOL WriteFile(HANDLE hFile,

LPCVOID lpBuffer,

DWORD nNumberOfBytesToWrite,

LPDWORD lpNumberOfBytesWritten,

LPOVERLAPPED lpOverlapped);

参数说明:

-hFile:串口句柄

-lpBuffer:待写入数据的首地址

-nNumberOfBytesToWrite:待写入数据的字节数长度

-lpNumberOfBytesWritten:函数返回的实际写入串口的数据个数的地址,利用此变量可判断实际写入的字节数和准备写入的字节数是否相同。

-lpOverlapped:重叠I/O结构的指针

ReadFile()

用途:读串口数据

原型:BOOL ReadFile(HANDLE hFile,

LPVOID lpBuffer,

DWORD nNumberOfBytesToRead,

lpNumberOfBytesRead,

lpOverlapped);

参数说明:

-hFile:串口句柄

-lpBuffer:存储被读出数据的首地址

-nNumberOfBytesToRead:准备读出的字节个数

-NumberOfBytesRead:实际读出的字节个数

-lpOverlapped:异步I/O结构

在同步方式下,调用ReadFile或WriteFile后,当实际读写操作完成或发生超时时才返回调用程序。而异步方式函数在启动接收或发送过程后立即返回,程序继续向下执行,程序在调用ReadFile和WriteFile时必须提供一个Overlapped数据结构指针,该结构中包含一个手动事件同步对象,其后的程序必须借助于该事件同步对象,完成数据的接收和发送过程。通信端口的超时设置对读写的处理方式也会产生影响,如果调用读写函数时发生端口超时,则读写函数立即返回并返回已传输的数据字节数。

ReadFile函数只要在串行口输入缓冲区中读入指定数量的字符,就算完成操作。

而WriteFile函数不但要把指定数量的字符拷入到输出缓冲中,而且要等这些字符从串行口送出去后才算完成操作。

如果不再使用某一端口,须将该端口关闭,以便其他程序可以使用该端口。如果不显式关闭某端口,当程序退出时打开的端口也将被自动关闭。但为了安全起见,最好是显式的关闭它。

关闭串口的语句为CloseHandle()。

CloseHandle()

用途:关闭串口

原型:BOOL CloseHandle(HANDLE hObjedt)

说明:

-hObjedt:串口句柄

操作说明:成功关闭串口时返回true,否则返回false

当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,线程应该调用GetLastError函数分析返回的结果。例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING。如果GetLastError 函数返回ERROR_IO_PENDING,则说明重叠操作还未完成,线程可以等待操作完成。

有两种等待办法:一种办法是用象WaitForSingleObject这样的等待函数来等待OVERLAPPED结构的hEvent成员,可以规定等待的时间,在等待函数返回后,调用GetOverlappedResult。

另一种办法是调用GetOverlappedResult函数等待,如果指定该函数的bWait参数为TRUE,那么该函数将等待OVERLAPPED结构的hEvent 事件。GetOverlappedResult可以返回一个OVERLAPPED结构来报告包括实际传输字节在内的重叠操作结果。

如果规定了读/写操作的超时,那么当超过规定时间后,hEvent成员会变成有信号的。因此,在超时发生后,WaitForSingleObject和GetOverlappedResult都会结束等待。WaitForSingleObject的dwMilliseconds参数会规定一个等待超时,该函数实际等待的时间是两个超时的最小值。注意GetOverlappedResult不能设置等待的时限,因此如果hEvent 成员无信号,则该函数将一直等待下去

GetOverlappedResult函数调用方法如下:

BOOL GetOverlappedResult(

HANDLE hFile, //用CreateFile 获得的文件句柄

LPOVERLAPPED lpOverlapped, //指向一个在启动重叠操作时指定的OVERLAPPED结构(即

//读写函数中指定的OverLapped结构)LPDWORD lpNumberOfBytesTransferred,//实际传输的字节数

BOOL bWait, //是否等待悬挂的重叠操作完成,若为TRUE,则此函数直到操作完成后才//返回。

);

OVERLAPPED结构定义如下:

typedef struct _OVERLAPPED {

DWORD Internal;

DWORD InternalHigh;

DWORD Offset;

DWORD OffsetHigh;

HANDLE hEvent;

} OVERLAPPED;

如果采用异步方式,则在调用ReadFile或WriteFile函数时必需指定一个Overlapped 结构,调用后程序可继续执行其它操作,在合适的地方再调用函数GetOverlappedResult判断异步重叠操作是否完成(判断OVERLAPPED结构中的hEvent是否被置位)。

WaitCommEvent()

用途:用来判断用SetCommMask()函数设置的串口通信事件是否已发生。

原型:BOOL WaitCommEvent(HANDLE hFile,

LPDWORD lpEvtMask,

LPOVERLAPPED lpOverlapped

);

参数说明:

-hFile:串口句柄

-lpEvtMask:函数执行完后如果检测到串口通信事件的话就将其写入该参数中。

-lpOverlapped:异步结构,用来保存异步操作结果。

当由SetCommMask函数所指定的事件产生时这个函数将返回TRUE。

注:在用api函数撰写串口通信函数时大体上有两种方法,一种是查寻法,另外一种是事件通知法。

这两种方法的区别在于收串口数据时,前一种方法是主动的周期性的查询串口中当前有没有数据;后一种方法是事先设置好需要监视的串口通信事件,然后依靠单独开设的辅助线程进行监视该事件是否已发生,如果没有发生的话该线程就一直不停的等待直到该事件发生后,将该串口事件以消息的方式通知主窗体,然后主窗体收到该消息后依据不同的事件性质进行处理。比如说当主窗体收到监视线程发来的RX_CHAR(串口中有数据)的消息后,就可以用ReadFile() 函数去读串口。

实例4:

/****************** example4.cpp ******************************************/ /* lishaoan 2009-07-10 *****************************************************/ /* lishaoan1898@https://www.wendangku.net/doc/181731130.html, ******************************************************/

#include

#include

#include

HANDLE hComm;

OVERLAPPED m_ov;

COMSTAT comstat;

DWORD m_dwCommEvents;

bool openport(char *portname)//打开一个串口

{

hComm = CreateFile(portname,

GENERIC_READ | GENERIC_WRITE,

0,

0,

OPEN_EXISTING,

FILE_FLAG_OVERLAPPED, //如果在调用CreateFile创建句柄时指

//定了FILE_FLAG_OVERLAPPED标志,那么

//调用ReadFile和WriteFile对该句柄进

//行的操作就应该是重叠的;如果未指定

//重叠标志,则读写操作应该是同步的//在同步执行时,函数直到操作完成后才返回。这意味着同步执行时线程会被阻塞,从//而导致效率下降。在重叠执行时,即使操作还未完成,这两个函数也会立即返回,费//时的I/O操作在后台进行

0);

if (hComm == INVALID_HANDLE_VALUE)

return FALSE;

else

return true;

}

bool setupdcb(int rate_arg)

{

DCB dcb;

int rate= rate_arg;

memset(&dcb,0,sizeof(dcb));//在一段内存块中填充某个给定的值,是对较大的结构

//体或数组进行清零操作的一种最快方法

if(!GetCommState(hComm,&dcb))//获取当前DCB配置

{

return FALSE;

}

/* -------------------------------------------------------------------- */ // set DCB to configure the serial port

dcb.DCBlength = sizeof(dcb);

/* ---------- Serial Port Config ------- */

dcb.BaudRate = rate;

dcb.Parity = NOPARITY;

dcb.fParity = 0;

dcb.StopBits = ONESTOPBIT;

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;

/* ----------------- misc parameters ----- */

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 DCB

if(!SetCommState(hComm,&dcb))

{

return false;

}

else

return true;

}

bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD ReadTotalconstant,DWORD WriteTotalMultiplier,DWORD WriteTotalconstant) //在用readfile和writefile读写串行口时,需要考虑超时问题,读写串口的超时有两

//种:间隔超时和总超时,写操作只支持总超时,而读操作两种超时均支持,如果所有

//写超时参数均为0,那么就不使用写超时。

{

COMMTIMEOUTS timeouts;

timeouts.ReadIntervalTimeout=ReadInterval; //读间隔超时

timeouts.ReadTotalTimeoutConstant=ReadTotalconstant; //读时间系数

timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier; //读时间常量

timeouts.WriteTotalTimeoutConstant=WriteTotalconstant; // 写时间系数

timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier; //写时间常

//量, 总超时的计算公式是:总超时=时间系数×要求读/写的字符数+时间常量

if(!SetCommTimeouts(hComm, &timeouts))

{

return false;

}

else

return true;

}

ReceiveChar( )

{

BOOL bRead = TRUE;

BOOL bResult = TRUE;

DWORD dwError = 0;

DWORD BytesRead = 0;

char RXBuff;

for (;;)

{

bResult = ClearCommError(hComm, &dwError, &comstat);

// 在使用ReadFile 函数进行读操作前,应先使用ClearCommError函数清除错误

if (comstat.cbInQue == 0)// COMSTAT结构返回串口状态信息

//本文只用到了cbInQue成员变量,该成员变量的值代表输入缓冲区的字节数 continue;

if (bRead)

{

bResult = ReadFile(hComm, // Handle to COMM port串口的句柄

&RXBuff, // RX Buffer Pointer

// 读入的数据存储的地址,即读入的数据将存 //储在以该指针的值为首地址的一片内存区

1, // Read one byte要读入的数据的字节数,

&BytesRead, // Stores number of bytes read, 指向一个DWORD

//数值,该数值返回读操作实际读入的字节数

&m_ov); // pointer to the m_ov structure

// 重叠操作时,该参数指向一个OVERLAPPED结构,同步操作时,该参数为NULL printf("%c",RXBuff);

if (!bResult)// 当ReadFile和WriteFile返回FALSE时,不一定就是操作失

//败,线程应该调用GetLastError函数分析返回的结果

{

switch (dwError = GetLastError())

{

case ERROR_IO_PENDING:

{

bRead = FALSE;

break;

}

default:

{

break;

}

}

}

else

{

bRead = TRUE;

}

} // close if (bRead)

if (!bRead)

{

bRead = TRUE;

bResult = GetOverlappedResult(hComm, // Handle to COMM port

&m_ov, // Overlapped structure

&BytesRead, // Stores number of bytes read TRUE); // Wait flag

}

}

}

WriteChar(BYTE* 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 buffer

bResult = WriteFile(hComm, // Handle to COMM Port, 串口的句柄

m_szWriteBuffer, // Pointer to message buffer in calling finction

// 即以该指针的值为首地址的nNumberOfBytesToWrite // 个字节的数据将要写入串口的发送数据缓冲区

m_nToSend, // Length of message to send, 要写入的数据的字节数

&BytesSent, // Where to store the number of bytes sent

// 指向指向一个DWORD数值,该数值返回实际写入的字节数

&m_ov ); // Overlapped structure

// 重叠操作时,该参数指向一个OVERLAPPED结构,

// 同步操作时,该参数为NULL

if (!bResult) // 当ReadFile和WriteFile返回FALSE时,不一定就是操作失

//败,线程应该调用GetLastError函数分析返回的结果

{

DWORD dwError = GetLastError();

switch (dwError)

{

case ERROR_IO_PENDING: //GetLastError函数返回

//ERROR_IO_PENDING。这说明重叠操作还未完成{

// continue to GetOverlappedResults()

BytesSent = 0;

bWrite = FALSE;

break;

}

default:

{

// all other error codes

break;

}

}

}

} // end if(bWrite)

if (!bWrite)

{

bWrite = TRUE;

bResult = GetOverlappedResult(hComm, // Handle to COMM port

&m_ov, // Overlapped structure

&BytesSent, // Stores number of bytes sent

TRUE); // Wait flag

// deal with the error code

if (!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;

}

void main()

{

if(openport("com2"))

printf("open comport success\n");

if(setupdcb(9600))

printf("setupDCB success\n");

if(setuptimeout(0,0,0,0,0)) //如果所有写超时参数均为0,那么就不使用写超时

printf("setuptimeout success\n");

PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

// 在读写串口之前,还要用PurgeComm()函数清空缓冲区

//PURGE_TXABORT 中断所有写操作并立即返回,即使写操作还没有完成。

//PURGE_RXABORT 中断所有读操作并立即返回,即使读操作还没有完成。

//PURGE_TXCLEAR 清除输出缓冲区

//PURGE_RXCLEAR 清除输入缓冲区

WriteChar("please send data now",20);

printf("received data:\n");

ReceiveChar( );

system("pause");

}

/************************** program end***************************************/

C语言串口通信助手代码

该程序全部由C写成没有C++ 更没用MFC 完全是自娱自乐给需要的人一个参考 #include "stdafx.h" #include #include "resource.h" #include "MainDlg.h" #include #include #include 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"));

51串口通信程序(带详细注释)

51串口通信程序(带详细注释) #include#include //后面有一个比较函数#define uchar unsigned char#define uint unsigned intbit UART_Flag=0; //定义串口接收标志位 uchar str[50]; //定义一数组uchar length=0; //数组长度从0 开始void init() //初 始化uart{ TMOD=0X20; //定时器1 定时器方式工作模式2,可自动重载的8 位计数器常把定时/计数器1 以模式2 作为串行口波特率发生器 SCON=0X50; //选择工作模式1 使能接收,允许发送,允许接收 EA=1; //开总中断 ES=1; //打开串口中断ET1=0; //打开定时器中断 PCON=0X80; //8 位自动重载,波特率加倍 TH1=0XFF; //用22.1184 mhz 波特率 TL1=0XFF;TR1=1; //打开中时器 }void UART_Putch(uchar dat) //输出一个字符{SBUF=dat; //把数据送给sbuf 缓 存器中 while(TI!=1);//发送标志位TI 如果发送了为1,没发送为0,没发送等待,到 了退出循环 TI=0; //到了,TI 清为0 }void init1() interrupt 4 //uart 中断,4 为串口中断{ if(RI==1) //收到数据{ uchar m=SBUF; //m 为计算机发送给串口的数据,例,open //总体思想是,计算 机通知串口,我要发数据了RI=0; //收到清0 if(m==) //判断m 这位数据有无{ UART_Putch(); //回车UART_Putch(); // 换行str[length]=; //数据最后位加0 标 志位表示发完了数据UART_Flag=1; // 传完标志位} else if(m==) { } else if(m==)//b表退格//下面几句表删锄{ UART_Putch();

机械使用说明书范本

目录 一.设备安全使用须知 (1) 二.机床简介 (3) 三.主要技术参数和连接尺寸 (4) 四.机床的吊运、安装及试车 (5) 五.主要部件结构性能及调整 (5) 六.液压系统 (6) 七.机床的润滑 (6) 八.机床的冷却-排屑系统 (7) 九.机床的调试与维修 (7) 十.易损件清单 (8) 十一.机床的工作环境 (28) 注: 图一.HTC6330b机床地基图 (9) 图二.机床占地面积图 (10) 图三.机床外观图 (11) 图四.机床吊运图 (12) 图五.HTC6330b数控车床加工尺寸及刀具干涉图 (13) 图六.主轴箱结构图 (14) 图七.X轴滑板 (17) 图八.液压卡盘系统 (18) 图九.Z轴丝杠连接图 (19) 图十.主轴连接尺寸 (20) 图十一.卡盘座尺寸图 (22) 图十二.液压原理图 (24) 图十三.导轨润滑装置 (25) 图十四.主轴润滑 (26) 图十五.冷却装置 (27)

HTC6330b 使用说明书一、设备安全使用须知 对于生产企业来讲,没有什么比安全工作更重要的了。为此,在机床使用说明书正文之前,制定本安全说明。 请尊敬的用户,在读正文之前,认真阅读并能领会,那将是我们的共同的幸福。 1.设备的使用 除非之前已受过培训并授权的人员进行特殊维修工作时,否则不得在设备防护罩松动或被取掉的情况下使用该机床。 该机床是为完成一系列具体操作而设计的。在质量保证期内,未经生产厂家授权,不得对设备进行任何形式的改装或用于其它超出机床使用范围的用途。 该机床是自动循环起动的,不得在机床的任何部位(尤其是机床移动部位)放置工具、工件及其它物品。刀具及其它设置一定要在处于夹紧状态时才可使用。 2.人员培训 机床若由人员不恰当的使用将会是很危险的,所以,在机床的安全使用,调整,操作及维修方面对其人员进行充分培训是完全必要的。 3.人员防护服 为了安全起见,应使用并爱护好您的防护服装及用具。在该机床工作事,切勿穿松垮的衣服,应去掉珠宝首饰并将长发挽到后面,戴安全防护眼镜并穿安全工作鞋。 4.防护罩--包括观察窗 在机床工作期间,所有的防护罩始终都应在位并处于牢固安全状态。防护罩上所带的观察窗应始终保持清洁,该观察窗是用特殊安全材料制成的,不得用其它材料替代。全部防护罩的目的在于最大程度减小加工时液体和铁屑飞溅的危险但并不能完全消除。 5.互锁及保护装置 为了保证您的安全,该机床配备了各种安全互锁及保护装置,切勿以任何方式干扰这类装置。紧急情况时,应立即使用紧急停止按扭。 6.安全用电 电是一种危险的物质并可致人于死命。 机床在进行清洁、检查故障、或停机以及进行任何调整之前一定要将主电源置于关闭(OFF)状态,这不会影响计算机存储器的存储功能,因为里面装有后备电池。 当机床突然断电时需重新送电之前,机床转塔刀架务必要先行返回原点位置。 7.液压系统 机床液压系统是在高,中压状态下工作的,其中有些部件即使是在机床停机的情况下也处于压力状态。所以对液压系统及其部件进行修理时一定要小心谨慎。 皮肤长期与液压油接触有可能会导致皮炎及过敏反应,当必需与其接触时,必须陪带整齐的防护用品。 8. 切削液 切削液里很容易滋生大量的细菌,设备上可能由此生成大量的粘液,机油和淤泥,并带有相关的异味因此要经常更换切削液。清除切削液及油污时应配带安全的防护设备和服装。尽量避免接触污油和切削液。9.润滑油 当不可避免地要接触油品时,则应使用维护很好的人体防护设备,护手霜并穿戴防护服。要严格遵守车间卫生纪律,尽快的将油从皮肤上清洗干净。切勿穿戴经油污浸泡过的衣物,且不要在口袋里装有油的碎纸布或手帕。 10.除油剂的使用 皮肤长期与除油剂接触有可能会导致皮炎。所以应避免与任何除油剂不必要的接触,当不可避免地要接触除油剂时,则应使用维护很好的人体防护设备,护手霜并穿戴防护服。要严格遵守车间卫生纪律,尽快的将油从皮肤上清洗干净。 11.压缩空气 2沈阳第一机床厂

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.wendangku.net/doc/181731130.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

c语言串口通信范例

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)();

static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.

设备使用说明书

镇江恒源汽车零部件有限公司立式收口机使用说明书 立式收口机 使 用 说 明 书 镇江市恒源汽车零部件有限公司

非常感谢您选择使用镇江市恒源汽车零部件有限公司生产的立式收口机,请详细阅读本品的使用说明书,以便于您的安全使用。 目录 1.安全说明 (3) 2.设备用途和适用范围 (7) 3.设备参数 (7) 4.设备动力系统 (8) 5.设备操纵系统 (12) 6.设备电气系统 (16) 7.设备冷却系统 (26) 8.设备运输、安装及试车 (27) 9.设备维护与保养 (29) 10.设备的结构及调整 (37) 11.设备易损零件及加工图 (38) 12.设备功能简介 (39)

1.安全说明 1.1安全规则概要 操作者使用设备前必须认真阅读安全说明,安全人员要确告操作者设备的要求。 1)设备的操作、维护和修理人员必须经过专业培训,有能力预见风险、有安全意识并能预测风险的人才能操作设备。 2)操作和维护人员必须认真阅读和掌握操作说明。 3)设备停止操作后,主油缸由于液压惯性还有短暂动作时间,应注意在工件停止前身体部位不得进入加工区域和触摸工件。 4)各种安全防护罩不得随意拆卸或改装,维护和修理时,应切断主电源。 5)设备上的各种安全警示标志不得随意拆卸,并要经常保持其干净、清晰。 警告:设备通电后,千万不要用手触摸模具和运动部件 6)设备的操作、维修和调整必须由专业人员进行,其他人员不得随意起动设备。 7)应按工艺规程操作设备,应由专业维修人员修理设备。 8)调整和维修设备时所用的扳手和钳子等工具必须是标准工具。 9)设备出现异常现象时应立即停机,并由专业维修人员及时检查和维修。 10)在拆卸和装配设备时,应使用有足够承载能力的起吊装置。 11)严格遵守设备上的安全说明和安全警告,并且确保其完整、清晰。 12)操作设备前要进行安全检查,确定各行程及限位开关、撞块、急停按钮、光栅安全可靠。 13)维修或调整设备前一定要在开关关闭、电源切断、工件完全停止的状态下进行。 14)操作人员不要穿宽松的衣服、袖口必须扎紧,不要戴领带、珠宝(戒指、手表等),必须戴护目镜和穿劳保鞋。 15)操作设备时,不论男女,长发必须戴工作帽并将其包裹在内。 16)整机噪音不大于75dB。建议穿戴适当的劳保用品,例如,戴听力保护器以减少听力的损失。 17)设备周围工作区要保持干净、明亮整洁、光线适宜,附近不能放置杂物,以免给操作者带来不便。 18)设备运行、加工时,不许移动各处防护罩。 19)离开设备时,必须关闭设备主电源开关。 20)设备重新起动时,必须对设备进行重新复位。 21)设备上,特别是设备的运动部件周围不能放置工件、工具等物件。 22)主油缸动作前一定要将工件(工装)固定牢靠,人员离开工作区域后才可起动设备。

Qt编写串口通信程序

Qt编写串口通信程序图文详解 (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动。) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类。我们可以去 https://www.wendangku.net/doc/181731130.html,/projects/qextserialport/files/ 进行下载,也可以去下载我上传到网上的: https://www.wendangku.net/doc/181731130.html,/bbs/read.php?tid=22847 下载到的文件为:qextserialport-1.2win-alpha.zip 其内容如下图: 我们在windows下只需要使用其中的6个文件: qextserialbase.cpp和qextserialbase.h,qextserialport.cpp和qextserialport.h,win_qextseri alport.cpp和win_qextserialport.h 如果在Linux下只需将win_qextserialport.cpp和win_qextserialport.h 换为posix_qextserialpo rt.cpp和posix_qextserialport.h即可。 第一部分: 下面我们将讲述编程的详细过程,这里我们先给出完整的程序,然后到第二部分再进行逐句分析。 1.打开Qt Creator,新建Qt4 Gui Application,工程名设置为mycom,其他使用默认选项。(注意:建立的工程路径不能有中文。) 2.将上面所说的6个文件复制到工程文件夹下,如下图。

c语言串口通信范例

c语言串口通信范例 This manuscript was revised by the office on December 22, 2012

一个c语言的串口通信程序范例 标签:分类: 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include <> #include <> #include <> #include <> #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20

static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100);

设备安全操作手册

设备安全操作手册

目录 1. 安全防护基本知识 (3) 1.1 安全三宝(安全帽、带、网)的使用 (3) 1.2 土方机械使用的安全防护 (3) 2. 设备安全操作规程 (4) 2.1挖掘机 (4) 2.2推土机、拖拉机 (6) 2.3压路机 (9) 2.4装载机 (10) 2.5平地机 (11) 2.6破碎锤 (13) 2.7空压机 (14) 2.8发电机组 (15) 2.9水泥混凝土混合料拌合设备 (17) 2.10混凝土泵车 (18) 2.11混凝土输送泵 (20) 2.12混凝土搅拌车 (22) 2.13沥青混凝土搅拌站 (23) 2.14摊铺机 (27) 2.15沥青洒布车 (30) 2.16沥青碎石封层车 (31) 2.17汽车吊 (32) 2.18塔吊 (34) 2.19平板拖车 (36) 2.20自卸车 (37) 2.21洒水车 (39) 2.22油车 (40) 2.23汽车通用 (41) 3. 安全作业规程 (44) 3.1 起重司机“十不吊” (44) 3.2汽车驾驶安全 (45) 3.3高边坡开挖作业的安全 (47) 3.4高处作业的安全 (47) 3.5 焊接作业的安全 (48) 3.6机修作业的安全 (50)

设备安全操作手册 1. 安全防护基本知识 1.1 安全三宝(安全帽、带、网)的使用 “三宝”即安全帽、安全带、安全网。 (1)进入施工现场,必须戴好符合标准的安全帽,并系好帽带。 (2)凡在2m以上悬空作业的人员,必须事先带好合格的安全带。 (3)凡无外架防护的建筑施工,必须在离地4m高处搭设一层固定安全吊网,每隔四层再搭设一道固定的安全吊网,并同时设一层随墙体逐层上升的安全吊网。 1.2 土方机械使用的安全防护 1.2.1内燃机、电动机和液压装置部分应按有关规定执行。 1.2.2机械进入现场前,应查明行驶路线上的桥梁、涵洞的净空和承载能力保证机械安全通过。 1.2.3轮式机械在公路或城市道路上行驶时应遵守交通部门的有关规定。 1.2.4施工区内有地下电缆和供排水管道时,必须查明走向,用明显记号标示,严禁在离电缆lm距离以内作业。 1.2.5配合机械作业的清底、平地、修坡等人员,应在机械的回转半径以外工作,如必须在回转半径内工作时,必须停止机械回转并制动好后方可作业。机上、机下人员应随时取得密切联系,确保安全生产。

java串口通讯程序

java串口通讯程序 1、下载java Communications api开发包。| 是Sun公司提供的,用于开发平台独立的通讯应用程序的扩展API。 2、将拷贝入C:\j2sdk1.4.2_04\bin 3、将拷贝入C:\j2sdk1.4.2_04\jre\lib\ext 4、将拷贝入C:\j2sdk1.4.2_04\jre\lib 5、编译文件 import .*; import .*; import .*; public class CommTest{ public static void main(String[] args){ SerialPort serialPort=null; DataOutputStream doutput=null; InputStream inputStream; CommPortIdentifier portId=null; String messageString="hello \n"; try{ portId=("COM1"); }catch(NoSuchPortException ne) { "ne"); (); } try{ serialPort=(SerialPort) ("TestComm", 5); OutputStream output = (); doutput=new DataOutputStream(output); inputStream = (); }catch(PortInUseException ex) { "ex"); (); }catch(IOException ie) { "ie"); (); //(); } try { (9600, , , ; } catch (UnsupportedCommOperationException e) {} } try { ()); } catch (IOException e) {}

C语言串口通信-源代码

#include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data);

用C编写的RS232串口通信程序

void main() { delayms(100); init(); //初始化系统 delayms(100); init_wdt(); //初始化看门狗 while(1) { while(!RI_0) //是否收到数据 { clr_wdt(); } RI_0=0; //清除接收中断标志 buffer=S0BUF; if(buffer==0x5a) //检测祯头0 start0=1; if(buffer==0x54) //检测祯头1 start1=1; if(buffer==0x5a) //检测祯尾0 end0=1; if(buffer==0xfe) //检测祯尾1 end1=1; if((start0==1)&(start1==1)) { buff[i]=buffer; //从祯头1开始存储数据 i++; } if((end0==1)&(end1==1)) //是否已经接收祯尾 { count=i; //数据长度为count个 i=1; if((buff[2]==0x03)&(count==107)) //是否422指令 { buff[0]=0x5a; //重填祯头0 buff[count-4]=0; //校验和清零 for(k=2;k<(count-4);k++) //计算校验和 { buff[count-4]+=buff[k]; } for(k=0;k

S0BUF=buff[k]; while(!TI_0); //等待发送完成 TI_0=0; //清除发送中断标志 } reset(); } else if((buff[2]==0x05)&(count==7)) //是否AD测试指令 { sendad(); reset(); } else if((buff[2]==0x18)&(count==7)) //是否发送时序信号指令 { sendpaulse(); reset(); } else //如果接收错误,则恢复各标志位为初始状态以便下次接收 { reset(); } } } } void reset() { start0=0; //祯头祯尾标志位清零 start1=0; end0=0; end1=0; for(k=0;k

51串口通信协议(新型篇)

51串口通信协议(新型篇) C51编程:这是网友牛毅编的一个C51串口通讯程序! //PC读MCU指令结构:(中断方式,ASCII码表示) //帧:帧头标志|帧类型|器件地址|启始地址|长度n|效验和|帧尾标志 //值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10 //字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2 //求和: ///////////////////////////////////////////////////////////////////// //公司名称:*** //模块名:protocol.c //创建者:牛毅 //修改者: //功能描述:中断方式:本程序为mcu的串口通讯提供(贞结构)函数接口,包括具体协议部分 //其他说明:只提供对A T89c51具体硬件的可靠访问接口 //版本:1.0 //信息:QQ 75011221 ///////////////////////////////////////////////////////////////////// #include #include //预定义 //帧 #define F_ST1 0x6e //帧头标志n #define F_ST2 0x79 //帧头标志y #define F_R 0x72 //帧类型读r #define F_W 0x77 //帧类型写w #define F_D 0x64 //帧类型数据帧d #define F_B 0x62 //帧类型写回应帧b #define F_C 0x63 //帧类型重发命令帧c #define F_Q 0x71 //帧类型放弃帧q #define F_ADDR 0x31 //器件地址0-9 #define F_END 0x7a //帧尾标志z #define F_SPACE 0x30 //空标志0 #define F_ERR1 0x31 //错误标志1,flagerr 1 #define F_ERR2 0x32 //错误标志2 2 //常数 #define S_MAXBUF 16 //接收/发送数据的最大缓存量 #define FIELD_MAXBUF 48 //最小场缓存,可以大于48字节,因为协议是以20字节为

51单片机与蓝牙串口通信程序

#include #include #include #include "LCD1602.h" #include "matrix_key.h" #define uint unsigned int #define uchar unsigned char #define Nop() _nop_() sbit P10 = P1^0; /*定义独立对地按键端口*/ sbit P11 = P1^1; /*定义独立对地按键端口*/ sbit P12 = P1^2; /*定义独立对地按键端口*/ sbit P13 = P1^3; /*定义独立对地按键端口*/ //shift键 bit shift_flag; bit call_flag ; bit CallIn_flag=0; bit reci_flag; bit reci_flag1; sbit sled_en_port = P3^6; /*定义数码管数据锁存器控制端口*/ sbit led_en_port = P2^5; /*定义发光二极管数据锁存器控制端口*/ sbit ds1302_en_port = P2^2; /*定义时钟的选片脚*/ uchar CallIn_Num[15];//={"00000000000"}; uchar CallOut_Num[15]={" "}; uchar m=0; //拨号指针 uchar temp='?'; uchar code clr[16]={" "}; uchar code lcd_table[16] = {"Ky: Cm: Re: "}; //uchar send_buff[15]; uchar reci_buff[15]={" "}; uchar z; //接收缓冲区指针 uchar time;//定时器中断次数 uchar code mun_to_char[]={"0123456789ABCDEF"}; /*1MS为单位的延时程序*/ void init(); void send(uchar cc); void send_f(uchar ccc); void interrupt_pro(); void key_pro(); void call_out();

设备管理手册范本

中泰化学托克逊能化 设备管理手册 活动主题(润滑保养) 原料车间丙班

二〇一七年三月二十日

设备润滑保养制度 1、目的: 为能保证皮带运输的装置运行及延长使用寿命,减少设备的磨损,提高设备运行率。特制订本制度。 2、围: 本制度适用于中泰化学托克逊能化之原料车间。 3、职责: 3.1 设备员 3.1.1 起草设备保养制度。 3.1.2 严格巡检,按要求填写车间巡检记录。 3.1.3 组织计划设备清洗换油,检修计划实施情况。 3.2 班长:组织协调好本班人员按要求进行加油。3.3 操作人员: 3.3.1 熟悉所操作设备的润滑系统和各部位的润滑方法,严格按照润滑“五定”要求正确合理润滑。 3.3.2 班前检查加油,保证设备处于良好润滑状态。 3.3.3 发现油变质或油箱缺油时,及时报告。 3.3.4 保管好自己使用的润滑工具,保持其清洁完好。我:

4、设备润滑的“五定”工作容: 一、(1)定点:根据设备的润滑部位和润滑点的位置及数量,进行加油、换油,并要求 熟悉它的结构和润滑方法,不得遗漏。 (2)定质:使用的油品种质量必须经过检验并符合国家标准,润滑油按照润滑卡或铭牌规定油品使用,清洗换油时要保证清洗质量,润滑器具保持清洁,设备上各种润滑装置要完整。防止尘土、铁屑、粉末、水分等落入,禁止乱用油(脂)或用不干净的油(脂)。(3)定量:在保证良好润滑的基础上,本着节约用油的原则规定油箱换油和各润滑点每班用油的定额。(4)定期:按照润滑标准或铭牌规定的时间周期进行加油、添油或更换新油。 (5)定人:要明确规定什么润滑部位和润滑点由操作工负责加油,什么部位由维修工负责加油、换油,加换油操作工要求为专职,不得随意更换。 二、“三级过滤” 三级过滤”:检验合格的油品进固定油桶是进行一极过滤;固定油桶进加油工具是二级过滤;加油工具里的油进入设备润滑点是要三级过滤。润滑油“三级过滤”示意图如图所示:

MFC实现对串口通信的编写

在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。计算机和单片机(如MCS-51)都具有串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。 实际工作中利用串口完成通信任务的时候非常之多。已有一些文章介绍串口编程的文章在计算机杂志上发表。但总的感觉说来不太全面,特别是介绍32位下编程的更少,且很不详细。笔者在实际工作中积累了较多经验,结合硬件、软件,重点提及比较新的技术,及需要注意的要点作一番探讨。希望对各位需要编写串口通信程序的朋友有一些帮助 一.串行通信的基本原理 串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。 在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。 应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。 串口通信程序的流程如下图: 二.串口信号线的接法 一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。25芯和9芯的主要信号线相同。以下的介绍是以25芯的RS-232C为例。 ①主要信号线定义: 2脚:发送数据TXD; 3脚:接收数据RXD; 4脚:请求发送RTS; 5脚:清除发送CTS; 6脚:数据设备就绪DSR;20脚:数据终端就绪DTR;8脚:数据载波检测DCD; 1脚:保护地; 7脚:信号地。 ②电气特性: 数据传输速率最大可到20K bps,最大距离仅15m. 注:看了微软的MSDN 6.0,其Windows API中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到RS_256000,即256K bps! 也不知道到底是什么串

串口通信测试方法

串口通信测试方法 1 关于串口通信的一些知识: RS-232C是目前最常用的串行接口标准,用来实现计算机和计算机之间、计算机和外设之间的数据通信。 在PC机系统中都装有异步通信适配器,利用它可以实现异步串行通信。而且MCS-51单片机本身具有一个全双工的串行接口,因此只要配以电平转换的驱动电路、隔离电路就可以组成一个简单可行的通信接口。 由于MCS-51单片机的输入和输出电平为TTL电平,而PC机配置的是RS-232C 标准串行接口,二者电气规范不一致,因此要完成PC机与单片机的数据通信,必须进行电平转换。 注明:3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片: 2 实现串口通信的三个步骤: (1)硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 使用MAX232串口通信电路图(9孔串口接头) (2)串行通信程序设计 ①通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种

约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC 机与单片机之间进行通信,在设计过程中,有如下约定:

智能化系统设备操作手册范本

智能化系统设备操 作手册

目录 1 编制说明 ............................................................ 错误!未定义书签。 2 安保机房建设概况............................................. 错误!未定义书签。 2.1 操作区设备及功能............................................. 错误!未定义书签。 2.2 核心区设备及功能............................................. 错误!未定义书签。 3 各子系统的操作流程说明 ................................. 错误!未定义书签。 3.1 视频监控系统操作............................................. 错误!未定义书签。 3.1.1 使用监控控制键盘切换分频显示及液晶拼接屏画面的操作... 错误!未定义书签。 3.1.2 使用管理电脑控制拼接屏图像显示与切换的操作错误!未定义书签。 3.1.3 视频监控录像的回放操作 ............................. 错误!未定义书签。 3.1.3.1 本地回放操作 ........................................... 错误!未定义书签。 3.1.3.2 远程回放操作 ........................................... 错误!未定义书签。 3.2 防盗报警系统操作............................................. 错误!未定义书签。 3.2.1 使用报警键盘实现布防、撤防和旁路的操作错误!未定义书签。 3.2.2 利用报警键盘实现联动报警的设置.............. 错误!未定义书签。 3.3 门禁系统操作 .................................................... 错误!未定义书签。 3.3.1 金库卷帘门的操作 ......................................... 错误!未定义书签。 3.3.2 金库区与办公区通道侧门操作 ..................... 错误!未定义书签。

相关文档