串口简介

串口简介
串口简介

1.串口简介

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是”数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”

该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于 4% 的情况下,传输电缆长度应为 50 英尺。

Linux 操作系统从一开始就对串行口提供了很好的支持,本文就 Linux 下的串行口通讯编程进行简单的介绍,如果要非常深入了解,建议看看本文所参考的《Serial Programming Guide for POSIX Operating》。

2.计算机串口的引脚说明

3.序号信号名称符号流向功能

4. 2 发送数据TXD DTE→DCE DTE发送串行数据

5. 3 接收数据RXD DTE←DCE DTE接收串行数据

6. 4 请求发送RTS DTE→DCE DTE请求 DCE 将线路切

换到发送方式

7. 5 允许发送CTS DTE←DCE DCE告诉 DTE 线路已接

通可以发送数据

8. 6 数据设备就绪DSR DTE←DCE DCE 准备好

9.7 信号地信号公共地

10.8 载波检测DCD DTE←DCE表示 DCE 接收到远程载

11.20 数据终端就绪DTR DTE→DCE DTE 准备好

22 振铃指示RI DTE←DCE 表示 DCE 与线路接通,出

现振铃

12.串口操作

o串口操作需要的头文件

o#include /*标准输入输出定义*/

o#include /*标准函数库定义*/

o#include /*Unix 标准函数定义*/

o#include

o#include

o#include /*文件控制定义*/

o#include /*PPSIX 终端控制定义*/

#include /*错误号定义*/

o打开串口

在Linux下串口文件是位于/dev下的串口一为/dev/ttyS0; 串口

二为/dev/ttyS1;打开串口是通过使用标准的文件打开函数操作:o int fd;

o/*以读写方式打开串口*/

o fd = open( "/dev/ttyS0", O_RDWR);

o if (-1 == fd){

o/* 不能打开串口一*/

o perror(" 提示错误!");

}

o设置串口

最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。

o struct termio

o{ unsigned short c_iflag; /* 输入模式标志 */

o unsigned short c_oflag; /* 输出模式标志 */

o unsigned short c_cflag; /* 控制模式标志*/

o unsigned short c_lflag; /* local mode flags */

o unsigned char c_line; /* line discipline */

o unsigned char c_cc[NCC]; /* control characters */

};

设置这个结构体很复杂,我这里就只说说常见的一些设置:?波特率设置

下面是修改波特率的代码:

?struct termios Opt;

?tcgetattr(fd, &Opt);

?cfsetispeed(&Opt,B19200); /*设置为

19200Bps*/

?cfsetospeed(&Opt,B19200);

tcsetattr(fd,TCANOW,&Opt);

设置波特率的例子函数:

/**

*@brief 设置串口通信速率

*@param fd 类型 int 打开串口的文件句柄

*@param speed 类型 int 串口速度

*@return void

*/

int speed_arr[] = { B38400, B19200, B9600, B4800, B2400,

B1200, B300,

B38400,

B19200, B9600, B4800, B2400, B1200, B300, };

int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,

19200,

9600, 4800, 2400, 1200, 300, };

void set_speed(int fd, int speed){

int i;

int status;

struct termios Opt;

tcgetattr(fd, &Opt);

for ( i= 0; i < sizeof(speed_arr) /

sizeof(int); i++) {

if (speed == name_arr[i]) {

tcflush(fd, TCIOFLUSH);

cfsetispeed(&Opt,

speed_arr[i]);

cfsetospeed(&Opt,

speed_arr[i]);

status = tcsetattr(fd1,

TCSANOW, &Opt);

if (status != 0) {

perror("tcsetattr

fd1");

return;

}

tcflush(fd,TCIOFLUSH);

}

}

}

?效验位和停止位的设置:

?无效验 8位 Option.c_cflag &= ~PARENB; ? Option.c_cflag &= ~CSTOPB;

? Option.c_cflag &= ~CSIZE;

? Option.c_cflag = ~CS8;

?奇效验(Odd) 7位 Option.c_cflag = ~PARENB;

? Option.c_cflag &= ~PARODD;

? Option.c_cflag &= ~CSTOPB;

? Option.c_cflag &= ~CSIZE;

? Option.c_cflag = ~CS7;

?偶效验(Even) 7位 Option.c_cflag &= ~PARENB; ? Option.c_cflag = ~PARODD;

? Option.c_cflag &= ~CSTOPB;

? Option.c_cflag &= ~CSIZE;

? Option.c_cflag = ~CS7;

?Space效验 7位 Option.c_cflag &= ~PARENB; ? Option.c_cflag &= ~CSTOPB; ? Option.c_cflag &= &~CSIZE;

Option.c_cflag = CS8;

设置效验的函数:

/**

*@brief 设置串口数据位,停止位和效验位

*@param fd 类型 int 打开的串口文件句柄

*@param databits 类型 int 数据位取值为 7 或者8

*@param stopbits 类型 int 停止位取值为 1 或者2

*@param parity 类型 int 效验类型取值为

N,E,O,,S

*/

int set_Parity(int fd,int databits,int stopbits,int parity)

{

struct termios options;

if ( tcgetattr( fd,&options) != 0) {

perror("SetupSerial 1");

return(FALSE);

}

options.c_cflag &= ~CSIZE;

switch (databits) /*设置数据位数*/

{

case 7:

options.c_cflag = CS7;

break;

case 8:

options.c_cflag = CS8;

break;

default:

fprintf(stderr,"Unsupported data

sizen"); return (FALSE);

}

switch (parity)

{

case ''n'':

case ''N'':

options.c_cflag &= ~PARENB; /* Clear parity enable */

options.c_iflag &= ~INPCK; /* Enable parity checking */

break;

case ''o'':

case ''O'':

options.c_cflag = (PARODD PARENB); /* 设置为奇效验*/

options.c_iflag = INPCK; /* Disnable parity checking */

break;

case ''e'':

case ''E'':

options.c_cflag = PARENB; /* Enable parity */

options.c_cflag &= ~PARODD; /* 转

换为偶效验*/

options.c_iflag = INPCK; /* Disnable parity checking */

break;

case ''S'':

case ''s'': /*as no parity*/

options.c_cflag &= ~PARENB;

options.c_cflag &= ~CSTOPB;break;

default:

fprintf(stderr,"Unsupported parityn");

return (FALSE);

}

/* 设置停止位*/

switch (stopbits)

{

case 1:

options.c_cflag &= ~CSTOPB;

break;

case 2:

options.c_cflag = CSTOPB;

break;

default:

fprintf(stderr,"Unsupported stop bitsn");

return (FALSE);

}

/* Set input parity option */

if (parity != ''n'')

options.c_iflag = INPCK;

tcflush(fd,TCIFLUSH);

options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/ options.c_cc[VMIN] = 0; /* Update the options and do it NOW */

if (tcsetattr(fd,TCSANOW,&options) != 0)

{

perror("SetupSerial 3");

return (FALSE);

}

return (TRUE);

}

需要注意的是:如果不是开发终端之类的,只是串口传输数

据,而不需要串口来处理,那么使用原始模式(Raw Mode)方

式来通讯,设置方式如下:

options.c_lflag &= ~(ICANON ECHO ECHOE ISIG);

/*Input*/

options.c_oflag &= ~OPOST; /*Output*/

?读写串口

设置好串口之后,读写串口就很容易了,把串口当作文件读

写就是。

发送数据

?char buffer[1024];

?int Length;

?int nByte;

?

nByte = write(fd, buffer ,Length);

读取串口数据

使用文件操作read函数读取,如果设置为原始模式(Raw

Mode)传输数据,那么read函数返回的字符数是实际串口收

到的字符数。可以使用操作文件的函数来实现异步读取,如

fcntl,或者select等来操作。

char buff[1024];

int Len;

int readByte = read(fd,buff,Len);

?关闭串口

关闭串口就是关闭文件。

close(fd);

13.例子:下面是一个简单的读取串口数据的例子,使用了上面定义的一些函

数和头文件

14./************************************************************

**********代码说明:使用串口二测试的,发送的数据是字符,

15.但是没有发送字符串结束符号,所以接收到后,后面加上了结束符号。我

测试使用的是单片机发送数据到第二个串口,测试通过。

16.*************************************************************

*********/

17.#define FALSE -1

18.#define TRUE 0

19./************************************************************

*********/

20.int OpenDev(char *Dev)

21.{

22. int fd = open( Dev, O_RDWR ); // O_NOCTTY

O_NDELAY

23. if (-1 == fd)

24. {

25. perror("Can''t Open Serial Port");

26. return -1;

27. }

28. else

29. return fd;

30.}

31.int main(int argc, char **argv){

32. int fd;

33. int nread;

34. char buff[512];

35. char *dev = "/dev/ttyS1"; //串口二

36. fd = OpenDev(dev);

37. set_speed(fd,19200);

38. if (set_Parity(fd,8,1,''N'') == FALSE) {

39. printf("Set Parity Errorn");

40. exit (0);

41. }

42.while (1) //循环读取数据

43.{

44. while((nread = read(fd, buff, 512))>0)

45. {

46. printf("nLen %dn",nread);

47. buff[nread+1] = '''';

48. printf( "n%s", buff);

49. }

50.}

51. //close(fd);

52. // exit (0);

}

53.串口配置参数详解(termios)

大多数系统都支持POSIX终端接口,POSIX终端通过一个termios结构来进行控制,该结构定义在termios.h文件中。termios结构如下:

54.struct termios

55. {

56. tcflag_t c_iflag; /* 输入选项标志 */

57. tcflag_t c_oflag; /* 输出选项标志 */

58. tcflag_t c_cflag; /* 控制选项标志 */

59. tcflag_t c_lflag; /* 本地选项标志 */

60. cc_t c_cc[NCCS]; /* 控制特性 */

};

c_iflag成员:

Flag Description

IGNBRK 忽略输入中的BREAK状态

BRKINT 如果设置了IGNBRK,将忽略BREAK。如果没有设置,但是设置了BRKINT,那么BREAK将使得输入和输出队列被刷新,如果终端是一个前台进程组的控制终端,这个进程组中所有进程将收到SIGINT信号。如果既未设置IGNBRK也未设置BRKINT,BREAK将视为NUL同义字符,除非设置了PARMRK,这种情况下被视为序列\377

IGNPAR 忽略桢错误和奇偶校验错误

PARMRK 如果没有设置IGNPAR,在有奇偶校验错误或者桢错误的字符前插入\377。如果既没有设置IGNPAR也没有设置PARMRK,将所有奇偶校验错误或者桢错误的字符视为

INPCK 启用输入奇偶校验检测

ISTRIP 去掉第八位

INLCR 将输入的NL翻译为CR

IGNCR 忽略输入中的回车

ICRNL 将输入中的回车翻译为新行字符(除非设置了IGNCR)

IUCLC (不属于POSIX)将输入中的大写字母映射为小写字母

IXON 启用输出的XON/XOFF流控制

IXANY (不属于POSIX。1;XSI)允许任何字符来重新开始输出IXOFF 启用输入的XON/XOFF流控制

IMAXBEL (不属于POSIX)当输入队列满时响铃。LINUX没有实现该位,

总是将其视为已设置

c_oflag 成员

Flag Description

OPOST 启用具体实现自行定义的输出

OLCUC (不属于POSIX )将输出中的小写字母映射为大写字母

ONLCR (XSI )将输出中的新行符映射为回车-换行

OCRNL 将输出中的回车映射为新行符

ONOCR 不在第0列输出回车

ONLRET 不输出回车

OFILL 发送填充字符作为延时

OFDEL (不属于POSIX )填充字符是ASCII DEL (0177)。如果不设置填

充字符则是ASCII NUL

NLDLY 新行延时掩码。取值为NL0和NL1

CRDLY 回车延时掩码。取值为CR0,CR1,CR2或CR3

TABDLY 水平跳格延时掩码。取值为TAB0,TAB1,TAB2,TAB3(或XTABS )。

取值为TAB3,即XTABS ,将扩展跳格为空格(每个跳格符填充8个

空格)

BSDLY 回车延时掩码。取值为BS0或BS1.(从来没有被实现)

VTDLY 竖直跳格掩码。取值为VT0或VT1

FFDLY 进表延时掩码。取值为FF0或者FF1

c_cflag 成员

Flag Description

CBAUD (不属于POSIX )波特率掩码(4+1位)

CBAUDEX (不属于POSIX )扩展的波特率掩码(1位),包含在CBAUD 中 CSIZE 字符长度掩码。取值为CS5,CS6,CS7或CS8

CSTOPB 设置两个停止位

CREAD 打开接受者

PARENB 允许输出产生奇偶信息以及输入的奇偶校验

PARODD 输入和输出是奇校验

HUPCL 在最后一个进程关闭设备后,降低MODEM 控制线(挂断) CLOCAL 忽略MODEM 控制线

LOBLK (不属于POSIX )从非当前SHELL 层阻塞输出(用于sh1) CIBAUD (不属于POSIX )输入速度的掩码。CIBAUD 各位的值与CBAUD 各

位相同,左移了IBSHIFT 位

CRTSCTS (不属于POSIX )启用RTS/CTS (硬件)控制流

c_lflag 成员

Flag

Description ISIG 当接收到字符INTR ,QUIT ,SUSP 或DSUSP 时,产生相应的信号

XCASE (不属于POSIX ;LINUX 下不支持)如果同时设置了ICANON ,终

端只有大写。输入被转换为小写,除了以\前缀的字符。输出时,

大写字符被前缀\,小写字符被转换成大写

ECHO

回显输入字符 ECHOE 如果同时设置了ICANON ,字符ERASE 擦除前一个输入字符,

WERASE 擦除前一个词

ECHOK 如果同时设置了ICANON ,字符KILL 删除当前行

ECHONL 如果同时设置了ICANON ,回显字符NL ,即使没有设置ECHO

ECHOCTL (不属于POSIX )如果同时设置了ECHO ,除了TAB ,NL ,START

和STOP 之外的ASCII 控制信号被回显为x ,这里X 是比控制信号

大0x40的ASCII 码。例如字符0x08(BS)被回显为H

ECHOPRT (不属于POSIX )如果同时设置了ICANON 和IECHO ,字符在删除的同时被打印

ECHOKE (不属于POSIX )如果同时设置了ICANON ,回显KILL 时将删除

一行中的每个字符,如同指定了ECHOE 和ECHORPT 一样

DEFECHO (不属于POSIX )只在一个进程读的时候回显 FLUSHO (不属于POSIX ;LINUX 不支持)输出被刷新。这个标志可以通

过键入字符DISCARD 来打开和关闭

NOFLSH 禁止产生SIGINT ,SIGQUIT 和SIGSUSP 信号时刷新输入和输出队

TOSTOP 向试图写控制终端的后台进程组发送SIGTTOU 信号 PENDIN

(不属于POSIX ;LINUX 不支持)在读入一个字符时,输入队列

中的所有字符被重新输出。(bash 用他来处理typeahead ) IEXTEN 启用实现自定义的输入处理。这个标志必须与ICANON 同时使用,

才能解释特殊字符EOL2,LNEXT ,REPRINT 和WERASE ,IUCLC 标志

才有效

c_cc 数组成员

略(这个表太长了,需要查询的话网上有很多).

61.常用设置

设置规范模式

规范模式是面向行的输入方式,输入字符被放入用于和用户交互可以编辑的缓冲区内,直接到读入回车或者换行符号时才结束。可以通过如下方式来设置:

option.c_lflag |= (ICANON | ECHO | ECHOE);

设置原始输入模式

原始输入模式是没有处理过的,当接收数据时,输入的字符在它们被接收后立即被传送,使用原始输入模式时候,一般可以选择取消ICANON,ECHO,ECHOE和ISIG选项。例如:

option.c_lflag &= ~(ICANON | ECHO | ECHOE);

设置输入奇偶选项

当激活c_cflag中的奇偶校验后,应该激活输入的奇偶校验。与之相关的标志有INPCK,IGNPAR,PARMRK和ISTRIP。一般是通过选择INPCK和ISTRIP 激活检验和移除奇偶位。例如:

option.c_iflag |= (INPCK | ISTRIP);

设置软件控制流

软件控制流通过IXON,IXOFF和IXANY标志来设置.例如:

option.c_iflag |=(IXON | IXOFF | IXANY);

选择预处理输出

通过OPOST标志来设置预处理的输出。例如:

option.c_oflag |= OPOST;

选择原始数据输出

原始数据的输出通过设置c_oflag的OPOST标志。例如:

option.c_oflag &= ~OPOST;

设置软件流控制字符

软件流控制字符是通过c_cc数组中的VSTART和VSTOP来设置的,一般来说,它们应该被设置城DC1(021八进制)和DC3(023八进制),分别表示ASCII码的XON和XOFF字符。

设置读超时

c_cc 数组中的VMIN指定了最少读取的字符数,如果设置为0,那么VTIME 就指定了读取每个字符的等待时间。VTIME是以1/10秒为单位指定接收字符的超时时间的,如果VTIME设置为0,而端口没有用open或者 fcntl 设置为NONBLOCK,那么read操作将会阻塞不确定的时间

62.网上找到的另一串口设置程序

设置波特率

63.int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200,

B300,

64. B38400, B19200, B9600, B4800, B2400, B1200,

B300, };

65.int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300,

66. 38400, 19200, 9600, 4800, 2400, 1200, 300, };

67.void set_speed(int fd, int speed)

68.{

69. int i;

70. int status;

71. struct termios Opt; //定义了这样一个结构

72.

73. tcgetattr(fd, &Opt); //用来得到机器原端口

的默认设置

74. for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)

75. {

76. if (speed == name_arr) //判断传进来是否相等

77. {

78. tcflush(fd, TCIOFLUSH); //刷新输入输出缓冲

79. cfsetispeed(&Opt, speed_arr);//这里分别设置

80. cfsetospeed(&Opt, speed_arr);

81. //这是立刻把bote

rates设置真正写到串口中去

82. status = tcsetattr(fd, TCSANOW, &Opt);

83. if (status != 0)

84. perror("tcsetattr fd1"); //设置错误

85. return;

86. }

87. tcflush(fd,TCIOFLUSH); //同上

88. }

}

设置数据位、校验位和停止位

int set_Parity(int fd,int databits,int stopbits,int parity) {

struct termios options; //定义一个结构

if ( tcgetattr( fd,&options) != 0) //首先读取系统默认设置options中,必须

{

perror("SetupSerial 1");

return(FALSE);

}

options.c_cflag &= ~CSIZE; //这是设置c_cflag选项不按位数据位掩码

switch (databits){ /*设置数据位数*/

case 7:

options.c_cflag |= CS7; //设置c_cflag选项数据位为7位

break;

options.c_cflag |= CS8; //设置c_cflag选项数据位为8位

break;

default:

fprintf(stderr,"Unsupported data size\n"); //其他的都不支持

return (FALSE);

}

switch (parity){ //设置奇偶校验,c_cflag 和c_iflag有效

case 'n':

case 'N': //无校验当然都不选

options.c_cflag &= ~PARENB; /* Clear parity enable */ options.c_iflag &= ~INPCK; /* Enable parity checking */

break;

case 'o': //奇校验其中PARENB校验位有效;PARODD奇校验

case 'O': options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/

options.c_iflag |= INPCK; /* Disnable parity checking */

break;

case 'e':

case 'E': //偶校验,奇校验不选就是偶校验了

options.c_cflag |= PARENB;/* Enable parity */

options.c_cflag &= ~PARODD;/* 转换为偶效验*/

options.c_iflag |= INPCK; /* Disnable parity checking */

break;

default:

fprintf(stderr,"Unsupported parity\n");

return (FALSE);

}

/* 设置停止位*/

switch (stopbits){ //这是设置停止位数,影响的标志是c_cflag

case 1:

options.c_cflag &= ~CSTOPB; //不指明表示一位停止位 break;

options.c_cflag |= CSTOPB; //指明CSTOPB表示两位,只有两种可能

break;

default:

fprintf(stderr,"Unsupported stop bits\n");

return (FALSE);

}

/* Set input parity option */

if (parity != 'n') //这是设置输入是否进行校验

options.c_iflag |= INPCK;

// 这个地方是用来设置控制字符和超时参数的,一般默认即可。稍微要注意的是c_cc数组的VSTART 和 VSTOP 元素被设定成DC1 和 DC3,代表ASCII 标准的XON和XOFF字符。所以如果在传输这两个字符的时候就传不过去,这时需要把软件流控制屏蔽 options.c_iflag &= ~(IXON | IXOFF | IXANY);

options.c_cc[VTIME] = 150; // 15 seconds

options.c_cc[VMIN] = 0;

tcflush(fd,TCIFLUSH); //刷新和立刻写进去

if (tcsetattr(fd,TCSANOW,&options) != 0)

{

perror("SetupSerial 3");

return (FALSE);

}

return (TRUE);

}

C++ 串口API 异步操作

C++ 串口API 异步操作50 有谁能说下串口API异步操作的例子,最好有代码的。 如果是BCB的更好,谢谢啦,有些函数直接看的不是很懂。一,我要同时向20个端口发送数据,句柄怎样才能控制好二,如果采用异步操作,怎样操作才最好,需要代码支持谢谢啦初始化: //串行设备句柄; HANDLE hComDev=0; //串口打开标志; BOOL bOpen=FALSE; //线程同步事件句柄; HANDLE hEvent=0; DCB dcb; COMMTIMEOUTS timeouts; //设备已打开 if(bOpen) return FALSE; //打开COM1

if((hComDev=CreateFile(“COM1”,GENERIC?READ|GENERIC?WRITE,0,N ULL,OPEN?EXISTING,FILE?ATTRIBUTE?NORMAL,NULL))==INVALID?HAN DLE?VALUE) return FALSE; //设置超时控制 SetCommTimeouts(hComDev,&timeouts); //设置接收缓冲区和输出缓冲区的大小 SetupComm(hComDev,1024,512); //获取缺省的DCB结构的值 GetCommState(hComDev,&dcb); //设定波特率为9600 bps dcb.BaudRate=CBR?9600; //设定无奇偶校验 dcb.fParity=NOPARITY; //设定数据位为8 dcb.ByteSize=8;

//设定一个停止位 dcb.StopBits=ONESTOPBIT; //监视串口的错误和接收到字符两种事件SetCommMask(hComDev,EV?ERR|EV?RXCHAR); //设置串行设备控制参数 SetCommState(hComDev,&dcb); //设备已打开 bOpen=TRUE; //创建人工重设、未发信号的事件 hEvent=CreateEvent(NULL,FALSE,FALSE, “WatchEvent”);

cc2530串口UART0通信实验(20200627130016)

/********************* 头文件*************************************************/ #include #include /********************* 宏定义*************************************************/ #define uint unsigned int #define uchar unsigned char // --------------- LED 控制端口------------------------------- // #define GLED P1_0〃绿色LED定义 #define RLED P1_1〃红色LED定义 // --------------- 按键输入端口------------------------------- // #define KEY1 P0_0 /********************* 全局变量**********************************************/ unsigned char Uart0_Rx; unsigned char Text_Data[]=" 海舟物联网教育!\r\n"; /********************* 函数声明***********************************************/ void Delay(uint); void Init_LED(void); void Init_Uart0(void); void Init_Sysclk(void); void Uart0_TX_Data(unsigned char *Data,int len); /****************************************************************************** * 函数名称: void Delay(uint n) * 函数功能: 软件延时函数 * 入口参数: * 出口参数: * 备注: ******************************************************************************/ void Delay(uint n) { uint i; for(i=0;i

串口协议

串口协议 所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层。目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字符和面向比特以及面向字节计数三种。其中,面向字节计数的同步协议主要用于DEC公司的网络体系结构中。 一、物理接口标准 1.串行通信接口的基本任务 (1)实现数据格式化:因为来自CPU的是普通的并行数据,所以,接口电路应具有实现不同串行通信方式下的数据格式化的任务。在异步通信方式下,接口自动生成起止式的帧数据格式。在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。 (2)进行串-并转换:串行传送,数据是一位一位串行传送的,而计算机处理数据是并行数据。所以当数据由计算机送至数据发送器时,首先把串行数据转换为并行数才能送入计算机处理。因此串并转换是串行接口电路的重要任务。 (3)控制数据传输速率:串行通信接口电路应具有对数据传输速率——波特率进行选择和控制的能力。 (4)进行错误检测:在发送时接口电路对传送的字符数据自动生成奇偶校验位或其他校验码。在接收时,接口电路检查字符的奇偶校验或其他校验码,确定是否发生传送错误。(5)进行TTL 与EIA电平转换:CPU 和终端均采用TTL电平及正逻辑,它们与EIA采用的电平及负逻辑不兼容,需在接口电路中进行转换。 (6)提供EIA-RS-232C 接口标准所要求的信号线:远距离通信采用MODEM 时,需要9根信号线;近距离零MODEM 方式,只需要3 根信号线。这些信号线由接口电路提供,以便与MODEM 或终端进行联络与控制。 2、串行通信接口电路的组成 为了完成上述串行接口的任务,串行通信接口电路一般由可编程的串行接口芯片、波特率发生器、EIA 与TTL 电平转换器以及地址译码电路组成。其中,串行接口芯片,随着大规模继承电路技术的发展,通用的同步(USRT)和异步(UART)接口芯片种类越来越多,如下表所示。它们的基本功能是类似的,都能实现上面提出的串行通信接口基本任务的大部分工作,且都是可编程的。才用这些芯片作为串行通信接口电路的核心芯片,会使电路结构比较简单。

9针全串口针脚定义详解

9针串口流控定义详细解析 DCD :载波检测。主要用于Modem通知计算机其处于在线状态,即Modem检测到拨号音,处于在线状态。 RXD:此引脚用于接收外部设备送来的数据;在你使用Modem时,你会发现RXD指示灯在闪烁,说明RXD引脚上有数据进入。 TXD:此引脚将计算机的数据发送给外部设备;在你使用Modem时,你会发现TXD指示灯在闪烁,说明计算机正在通过TXD引脚发送数据。 DTR:数据终端就绪;当此引脚高电平时,通知Modem可以进行数据传输,计算机已经准备好。GND:信号地;此位不做过多解释。 DSR:数据设备就绪;此引脚高电平时,通知计算机Modem已经准备好,可以进行数据通讯了。 RTS:请求发送;此脚有计算机来控制,用以通知Modem马上传送数据至计算机;否则,Modem将收到的数据暂时放入缓冲区中。 CTS: 清除发送;此脚由Modem控制,用以通知计算机将欲传的数据送至Modem。 RI : Modem通知计算机有呼叫进来,是否接听呼叫由计算机决定 很久很久以前,计算机还没有出现,那时就已经存在了(计算机)史前的串口设备(电传打字机,工控测量设备,通信调制解调器),为了连接这些串口,EIA制定了RS232标准,采用DB25接插件,支持同步和异步串口,D型的接口可以有效防止插反。标准化给使用带来了便利。 时光荏苒,个人计算机出现了,这些已有的串口设备毫无疑问地成为了最初的外设,自然而然地RS232标准被个人计算机采纳。但是设备制造商倾向于体积更小,成本更低的接口,因此,将DB25中未使用的和支持同步模式的引脚去掉,形成DB9。最初的情况相当混乱,因为DB9只定义了信号,却没有指定信号和引脚的对应关系,各个制造商只能自行定义。幸运的是,IBM的PC成了工业标准,DB9逐渐统一到IBM的定义上来。 DB9只有9根线,遵循RS232标准。定义如下: DTR,DSR------DTE设备准备好/DCE设备准备好。主流控信号。 RTS,CTS------请求发送/清除发送。用于半双工时,收发切换。属于辅助流控信号。半双工的意思是说,发的时候不收,收的时候不发。那么怎么区分收发呢?缺省时是DCE向DTE发送数据,当DTE决定向DCE发数据时,先有效RTS,表示DTE希望向DCE发送,一般DCE不能马上转换收发状态,DTE 就通过监测CTS是否有效来判断可否发送,这样避免了DTE在DCE未准备好时发送所导致的数据丢失。 全双工时,这两个信号一直有效即可。 随着计算机的日益普及,很多非RS232的串口也要接入PC机,如果为每一种新出现的串口都增加一个新的I/O口显然不现实,因为PC后面板位置有限,因此,将RS232串口和非RS232串口都通过RS232口接入是最佳方案。UART的U(通用)指的就是这个意思。早期ROM BIOS和DOS里的通信软件都是为RS232设计的,在没有检测到DCD有效前不会发送数据,因此,就连发送一个字符这样朴素的应用也要给出DCD、DTR、DSR等控制信号。因此,串口接头上要将一些控制线短接,或者干脆绕过系统软件自己写通信程序。 到此,UART的涵义就总结为:通用的异步(串行) I/O口。 就在UART冠以通用二字,准备一统江湖的时候,制造商们不满于它的速度、体积和灵活性(软件可配置),推出了USB和1394串口。目前,笔记本上的UART串口有被取消的趋势,因而有网友发出了“没有串口,吾谁与归”的慨叹,古今多少事,都付笑谈中,USB取代UART是后话,暂且不表。 话说自从贺氏(HAYES)公司推出了聪明猫(SmartModem),他们制定的MODEM接口就成了业界标准,自此以后,所有公司制造的兼容猫都符合贺氏标准(连A T指令也兼容,大家一起抄他呗)。 细观贺氏制定的MODEM串口,与RS232标准大不相同。DTR在整个通信过程中一直保持有效,

UART异步串口

MSP430程序库<二>UART异步串口 串行通信接口是处理器与其他设备进行数据通信最常用的方式之一。我的这个程序库是针对MSP430f14系列和MSP430f16系列的,我常用的单片机是这两款:msp430f149,ms p430f169。这两款单片机中均有两个增强型串行通信接口,都可以进行同步或是异步通信,甚至169的模块USART0还能进行进行I2C协议通信。在这里,我们只讨论异步串行通信。 硬件介绍: MSP单片机的USART模块可以配置成SPI(同步通信)模式或UART(异步通信)模式,这里只讨论UART方式。UART数据传输格式如下: 起始位,数据位由高到低7/8位,地址位0/1位,奇偶校验位奇偶或无,停止位1/2位。数据位位数、地址位、奇偶校验位、停止位均可由单片机内部寄存器控制;这两款单片机都有两个USART模块,有两套独立的寄存器组;以下寄存器命中出现x代表0或是1,0代表对应0模块的寄存器,1代表对应1模块的寄存器;其中,与串口模式设置相关的控制位都位于UxCTL寄存器,与接收相关的控制位都位于UxRCTL寄存器,与发送相关的控制位都位于UxTCTL寄存器;波特率设置用UxBR0、UxBR1、UxMCT L三个寄存器;接收与发送有独立的缓存UxRXBUF、UxTXBUF,并具有独立的移位寄存器和独立的中断;中断允许控制位位于IE1/2寄存器,中断标志位位于IFG1/2寄存器。 波特率设置:430的波特率设置用三个寄存器实现, UxBR0:波特率发生器分频系数低8位。 UxBR1:波特率发生器分频系数高8位。 UxMCTL:波特率发生器分频系数的小数部分实现。 设置波特率时,首先要选择合适的时钟源:USART模块可以设置的时钟源有UCLK引脚、ACLK、SMCLK;对于较低的波特率(9600以下),可选ACLK作为时钟源,这样,在LPM3(低功耗3)模式下,串口仍能正常发送接收数据;另外,由于串口接收过程有一个三取二判决逻辑,这至少需要三个时钟周期,因此分频系数必须大于3;波特率高于9600时,将不能使用ACLK作为时钟源,要调为频率较高的SMCLK作为时钟源;另外还可以外部输入UCLK时钟。分频系数计算公式如下:

uart串口资料

Application Note Specifications subject to change without notice, contact your sales representatives for the most recent information. UART 功能使用方法 1 適用產品:SM59R16A 2 / SM59R08A2 2 UART 使用概述: 2.1 提供兩組串通訊列埠 (UART0, UART1) 2.2 每一組UART 分別有獨立的緩衝記憶體,且傳送及接收則是共用. UART0 使用S0BUF UART1 使用S1BUF 當執行資料接收時,必須在前一筆資料完成執行工作後,否則會造成資料流失的問題;可由送傳中斷旗標或接收中斷旗標判斷是否完成執行工作的狀態. 2.3 當使用串通訊列埠時,系統時脈來源建議使用外部晶振.由於內部晶振頻率的誤差約為+5%,當 使用串通訊列埠時,系統時脈必須要求晶振頻率的誤差約為+2%. 3 以下說明與UART 相關的特殊控制暫存器及特殊狀態暫存器 Special Function Register (SFR) Mnemonic Description Direct Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 RESE T Serial interface 0 and 1 PCON Power control 87h SMOD MDUF - PMW - - STOP IDLE 00h BRGS Baud rate generator switch D8h BRS - - - - - - - 00h S0CON Serial Port 0 control register 98h SM0 SM1 SM20REN0TB80 RB80 TI0 RI0 00h S0RELL Serial Port 0 reload register low byte AAh S0REL .7 S0REL .6 S0REL .5 S0REL .4 S0REL .3 S0REL .2 S0REL .1 S0REL .0 00h S0RELH Serial Port 0 reload register high byte BAh - - - - - - S0REL .9 S0REL .8 00h S0BUF Serial Port 0 data buffer 99h S0BUF[7:0] 00h S1CON Serial Port 1 control register 9Bh SM - SM21REN1TB81 RB81 TI1 RI1 00h S1RELL Serial Port 1 reload register low byte 9Dh S1REL .7 S1REL .6 S1REL .5 S1REL .4 S1REL .3 S1REL .2 S1REL .1 S1REL .0 00h S1RELH Serial Port 1 reload register high byte BBh - - - - - - S1REL .9 S1REL .8 00h S1BUF Serial Port 1 data buffer 9Ch S1BUF[7:0] 00h

通信协议简介及区别(串行、并行、双工、RS232等)

基本的通讯方式有并行通讯和串行通讯两种。 并行通讯:一条信息的各位数据被同时传送的通讯方式称为并行通讯。 并行通讯的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距数米)的通讯。 串行通讯:一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。 串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几千米。 根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。信息只能单向传送为单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。 而按照串行数据的时钟控制方式,串行通信又可分为同步通信和异步通信两种方式。 异步通信:接收器和发送器有各自的时钟; 同步通信:发送器和接收器由同一个时钟源控制。 1、异步串行方式的特点 所谓异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。异步串行通信的特点可以概括为: ①以字符为单位传送信息。 ②相邻两字符间的间隔是任意长。 ③因为一个字符中的比特位长度有限,所以需要的接收时钟和发送时钟只要相近就可以,不需同步。 ④异步方式特点简单的说就是:字符间异步,字符内部各位同步。 2、异步串行方式的数据格式 异步串行通信的数据格式如图1所示,每个字符(每帧信息)由4个部分组成: ①1位起始位,规定为低电0; ②5~8位数据位,即要传送的有效信息; ③1位奇偶校验位; ④1~2位停止位,规定为高电平1。 3、同步串行方式的特点 所谓同步通信,是指数据传送是以数据块(一组字符)为单位,字符与字符之间、字符内部的位与位之间都同步。同步串行通信的特点可以概括为: ①以数据块为单位传送信息。 ②在一个数据块(信息帧)内,字符与字符间无间隔。 ③因为一次传输的数据块中包含的数据较多,所以接收时钟与发送进钟严格同步,通常要有同步时钟。 4、同步串行方式的数据格式 同步串行通信的数据格式如图2所示,每个数据块(信息帧)由3个部分组成: ①2个同步字符作为一个数据块(信息帧)的起始标志; ②n个连续传送的数据 ③2个字节循环冗余校验码(CRC) 图1 异步串行数据格式图2 同步串行数据格式

串口通信中用到的函数

Linux C语言中open函数 int open( const char * pathname, int flags); int open( const char * pathname,int flags, mode_t mode); 函数说明 参数pathname 指向欲打开的文件路径字符串。 下列是参数flags 所能使用的旗标: O_RDONLY 以只读方式打开文件 O_WRONLY 以只写方式打开文件 O_RDWR 以可读写方式打开文件。 上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。 O_CREAT 若欲打开的文件不存在则自动建立该文件。 O_EXCL 如果O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。 O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。 O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。 O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。 O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。 O_NDELAY 同O_NONBLOCK。 O_SYNC 以同步的方式打开文件。 O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。 O_DIRECTORY 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。 参数mode 组合 此为Linux2.2以后特有的旗标,以避免一些系统安全问题。参数mode 则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask 值所影响,因此该文件权限应该为(mode-umaks)。 S_IRWXU 00700 权限,代表该文件所有者具有可读、可写及可执行的权限。 S_IRUSR 或S_IREAD, 00400权限,代表该文件所有者具有可读取的权限。C语言中open函数 作用:打开和创建文件。 int open(const char *pathname, int oflag, ... /* mode_t mode */); 返回值:成功则返回文件描述符,否则返回 -1 对于 open 函数来说,第三个参数(...)仅当创建新文件时(即使用了O_CREAT 时)才使用,用于指定文件的访问权限位(access permission bits)。 pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp); oflag用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。 O_RDONLY 只读模式 O_WRONLY 只写模式 O_RDWR 读写模式 打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的: O_APPEND 每次写操作都写入文件的末尾 O_CREAT 如果指定文件不存在,则创建这个文件O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值 O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部容(即将其长度截短为0) O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。 O_NONBLOCK 如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继 I/O

Win32API 异步串口通讯

使用Win32API实现Windows下异步串口通讯 目录: 1.异步非阻塞串口通讯的优点 2.异步非阻塞串口通讯的基本原理 3.异步非阻塞串口通讯的基础知识 4.异步非阻塞串口通讯的实现步骤 一,异步非阻塞串口通讯的优点 读写串行口时,既可以同步执行,也可以重叠(异步)执行。 在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行,这样线程就可以干别的事情。 例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作。"重叠"一词的含义就在于此。 二,异步非阻塞串口通讯的基本原理 首先,确定要打开的串口名、波特率、奇偶校验方式、数据位、停止位,传递给CreateFile()函数打开特定串口; 其次,为了保护系统对串口的初始设置,调用GetCommTimeouts()得到串口的原始超时设置; 然后,初始化DCB对象,调用SetCommState() 设置DCB,调用SetCommTimeouts()设置串口超时控制;再次,调用SetupComm()设置串口接收发送数据的缓冲区大小,串口的设置就基本完成,之后就可以启动读写线程了。 三,异步非阻塞串口通讯的基础知识 下面来介绍并举例说明一下编写异步非阻塞串口通讯的程序中将会使用到的几个关键函数 CreateFile() 功能:打开串口设备 函数原型 HANDLE CreateFile( LPCTSTR lpFileName, // 串口名称字符串;如:"COM1" 或"COM2" DWORD dwDesiredAccess, // 设置读写属性(访问模式);一般为GENERIC_READ|GENERIC_WRITE, DWORD dwShareMode, // 共享模式;"必须"为0, 即不能共享 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性;一般为NULL DWORD dwCreationDistribution, // 创建方式,串口设置必须设置此值;在这里"必须"为OPEN_EXISTING DWORD dwFlagsAndAttributes, // 文件属性和标志;在这里我们设置成FILE_FLAG_OVERLAPPED ,实现异步I/O HANDLE hTemplateFile // 临时文件的句柄,通常为NULL ); 说明: 如果调用成功,那么该函数返回文件的句柄,如果调用失败,则函数返回INVALID_HANDLE_VALUE。Forexample: Handle m_hComm = CreateFile(com1,GENERIC_READ||GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERL APPED,0);

UART串口通信设计实例

2.5 UART串口通信设计实例(1) 接下来用刚才采用的方法设计一个典型实例。在一般的嵌入式开发和FPGA设计中,串口UART是使用非常频繁的一种调试手段。下面我们将使用Verilog RTL编程设计一个串口收发模块。这个实例虽然简单,但是在后续的调试开发中,串口使用的次数比较多,这里阐明它的设计方案,不仅仅是为了讲解RTL编程,而且为了后续使用兼容ARM9内核实现嵌入式开发。 串口在一般的台式机上都会有。随着笔记本电脑的使用,一般会采用USB转串口的方案虚拟一个串口供笔记本使用。图2-7为UART串口的结构图。串口具有9个引脚,但是真正连接入FPGA开发板的一般只有两个引脚。这两个引脚是:发送引脚TxD和接收引脚RxD。由于是串行发送数据,因此如果开发板发送数据的话,则要通过TxD线1 bit接着1 bit 发送。在接收时,同样通过RxD引脚1 bit接着1 bit接收。 再看看串口发送/接收的数据格式(见图2-8)。在TxD或RxD这样的单线上,是从一个周期的低电平开始,以一个周期的高电平结束的。它中间包含8个周期的数据位和一个周期针对8位数据的奇偶校验位。每次传送一字节数据,它包含的8位是由低位开始传送,最后一位传送的是第7位。

这个设计有两个目的:一是从串口中接收数据,发送到输出端口。接收的时候是串行的,也就是一个接一个的;但是发送到输出端口时,我们希望是8位放在一起,成为并行状态(见图2-10)。我们知道,串口中出现信号,是没有先兆的。如果出现了串行数据,则如何通知到输出端口呢?我们引入“接收有效”端口。“接收有效”端口在一般情况下都是低电平,一旦有数据到来时,它就变成高电平。下一个模块在得知“接收有效”信号为高电平时,它就明白:新到了一个字节的数据,放在“接收字节”端口里面。

串口通信协议

串口通信协议 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。 什么是RS-232 RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。 DB-9针连接头 9针串口连接口顺序图 从计算机连出的线的截面。 RS-232针脚的功能: 数据: TXD(pin 3):串口数据输出(Transmit Data) RXD(pin 2):串口数据输入(Receive Data) 握手: RTS(pin 7):发送数据请求(Request to Send) CTS(pin 8):清除发送(Clear to Send) DSR(pin 6):数据发送就绪(Data Send Ready) DCD(pin 1):数据载波检测(Data Carrier Detect) DTR(pin 4):数据终端就绪(Data Terminal Ready) 地线: GND(pin 5):地线 其他 RI(pin 9):铃声指示 什么是RS-422 RS-422(EIA RS-422-AStandard)是Apple的Macintosh计算机的串口连接标准。RS-422使用差分信号,RS-232使用非平衡参考地的信号。差分传输使用两根线

实现异步串口

异步传输是一种典型的基于字节的输入输出,指数据按每次一个字节进行传输,其传输速度低。同步传输是把数据字节组合起来一起发送,这种组合称之为帧,其传输速度比异步传输快,同步串口的传送速率高,异步串口实现简单,这是异步串口与同步串口间最主要的区别。 一,异步非阻塞串口通讯的优点 读写串行口时,既可以同步执行,也可以重叠(异步)执行。 在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。 在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行,这样线程就可以干别的事情。 例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作。"重叠"一词的含义就在于此。 二,异步非阻塞串口通讯的基本原理 首先,确定要打开的串口名、波特率、奇偶校验方式、数据位、停止位,传递给CreateFile()函数打开特定串口; 其次,为了保护系统对串口的初始设置,调用 GetCommTimeouts()得到串口的原始超时设置; 然后,初始化DCB对象,调用SetCommState() 设置DCB,调用SetCommTimeouts()设置串口超时控制; 再次,调用SetupComm()设置串口接收发送数据的缓冲区大小,串口的设置就基本完成,之后就可以启动读写线程了。 三,异步非阻塞串口通讯的基础知识 VC串口通信技术网下面来介绍并举例说明一下编写异步非阻塞串口通讯的程序 中将会使用到的几个关键函数 CreateFile() 功能:打开串口设备 函数原型 1.HANDLE CreateFile( 2.LPCTSTR lpFileName, // 串口名称字符串;如: "COM1" 或 "COM2" 3.DWORD dwDesiredAccess, // 设置读写属性(访问模式);一般为 GENERIC_READ|GENERIC_WRITE, 4.DWORD dwShareMode, // 共享模式;"必须"为 0, 即不能共享 5.LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性;一般为 NULL 6.DWORD dwCreationDistribution, // 创建方式,串口设置必须设置此值; 在这里"必须"为 OPEN_EXISTING 7.DWORD dwFlagsAndAttributes, // 文件属性和标志;在这里我们设置成 FILE_FLAG_OVERLAPPED ,实现异步I/O 8.HANDLE hTemplateFile // 临时文件的句柄,通常为NULL

异步串行通信协议的设计与实现

10 | 电子制作 2018年10月 时传送;串行通信,即数据一位一位顺序传送。串行通信能够节省传输线,特别是数据位数很多和远距离数据传送时,这一优点更为突出。现在流行的高级语言一般都支持对串口的直接操作,常用的单片机也把串行通讯口作为一个标准接口集成在单片机内,串行通讯接口的开发具有开发周期短,开发简单等特点。目前异步串行通信已广泛用于微机之间的通信、工业控制系统中的数据采集与控制、远程数据的传送等方面。 1 串口通信的基本原理 串口在嵌入式系统当中是一类重要的数据通信接口,其本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。 典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送数据线,(3)接收数据线。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:波特率是一个衡量通信速度的参数,它表示每秒钟传送的bit的个数;数据位是衡量通信中实际数据位的参数,当计算机发送一个信息包,标准的值是5、7和8位。如何设置取决于你的需求;停止位用于表示单个包的最后一位,典型的值为1,1.5和2位,停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会;奇偶校验位是串口通信中一种简单的检错方式,有四种检错方式——偶、奇、高和低,也可以没有校验位。做出统一规定。 在控制系统中,单片机间通信一般采用异步串行通信,传统的异步串行通信协议一般采用如图1所示的命令格式,命令消息包括帧头(命令码)、数据帧、校验帧;响应消息为ACK信号(ACK取不同的值,例如:正确响应 ACK = 0x55;错误响应 ACK = 0xAA)。由于在串口通信中还存在很多不可靠的因素,例如由于电磁干扰造成的帧字节丢失、传输误码,以及因主从单片机处理繁忙而造成的响应延迟等。传统的通信协议难以克服由于单片机处理繁忙而造成的响应延迟现象。如图2所示,当主芯片发送[命令1]后,当超过响应等待时间而没有得到ACK时,主芯片发[命令2],而此时在下一个响应等待时间内收到两次[ACK],这时将导致主芯片做出错误判断,调用并非本意的程序执行,严重影响系统的正常运行。因此,本文在通信协议的设计中,采用响应消息加权的方法,提高了通信的可靠性,保证系统正常运行。 图1 通信命令格式 图2 通信时序 本响应消息加权式通信协议,实现方式如下:通信协议

重新认识串口,使用交叉还是直连串口线 非原创

从接触51单片机开始就认识了串口,但前段时间越想越对串口迷茫:公头、母头、直连串口线、交叉串口线,这些到底该怎么连接把我搞得晕头转向。终于在不断的查阅资料、静静的苦思冥想和不断的看电路图、用万用表测试中,对串口有了透彻、清晰的认识。 先说一下我在很久以前遇到的一个小问题。我最初开始 使用的是优龙的开发板,串口线也是使用的配套的,没出现过问题。后来开始使用天嵌的开发板,当时为了省事,想继续用优龙提供的串口线,但是接到天嵌的开发板上启动时,串口没有任何信息。然后我改用天嵌提供的串口线连接,这样就都正确了。当时觉得这是个小问题,可能是优龙的串口线哪里出问题了,就没仔细考虑。 下面说标准的串口定义。无论是公头还是母头,都是2 脚是RXD,3脚是TXD,所以在任意两个串口通信时,使用 的连接线应该是交叉串口线。特别是一个公头一个母头的时候,是不能直接连接的,一定要使用交叉的一头公一头母的串口线。 再说一下市面的情况。按照标准的串口定义,应该都是 使用交叉串口线的,那为什么还有直连串口线呢?!这就是有些公司在设计串口电路的时候,为了配合使用直连串口线,将标准的串口定义改了。下面给两个电路图。

优龙板的串口电路图 天嵌的串口电路图 从这两个图大家就可以看到区别:优龙使用的是标准的定义,DB9插座的2脚接MAX3232的14脚,即RXD;而天嵌中DB9插座的二脚接的是13脚,即TXD。这样就很容易明白为什么我当时用优龙的串口线和天嵌的板子连行不通了!

总结一下,在实际使用中,不需要考虑标准非标准,而是要看电路里是如何定义的。只要记住RXD接TXD、TXD接RXD就可以了,根据电路里的设计决定使用直连串口线还是交叉串口线。

异步串行通信的工作方式

异步串行通信的工作方式,然后给出了VB MSComm控件下异步串行通信在电子衡器中的应用实例,包括硬件接口及软件设计。关键词:RS-232 异步串行通信Visual Basic 电子衡器控件计算机一般提供了2个25针或9针的RS-232标准串行口,简称为COM1和COM2。在某些应用中,我们还可以通过插通信卡来获得额外的RS-232标准串行口。利用这些串行口可以与其它数字设备进行一般的数据通信,计算机的串行接口主要用于远程通信和低速输入输出设备。由于串行数据通信传输线条数最少,而且有许多较便宜的专用芯片可实现它,发送和接受器也简单,因而对数据传输速度要求不高的计算机和数字设备间的近程通信,多采用串行通信实现。而目前各个厂家生产的电子衡器的称重仪表多配有与上位机通信的RS—232C串行接口,因而计算机与称重仪表之间的数据通信用串口很容易实现,只需要制作一条2芯或3芯的数据线编写相应的接口程序即可实现,不需要增加其他硬件设备。采用这种方式组成的微机电子衡器有许多优点:称重仪表经过多年的发展,在数据采集、抗干扰、可靠性等方面技术成熟,质量稳定;而计算机在存储容量、数据处理、查询、统计报表等数据管理方面有明显优势。正是两者的完美结合,才使计算机与称重仪表组成的在线式称重管理系统得到了广泛的应用。1串行通信的工作方式串行通信,可分为同步和异步两种方式。异步方式是指在约定的波特率下,传送和接受的数据不需要严格的保持同步,允许有相对的延迟,虽然速度较慢,但经济实用,所以异步串行通信现大量应用于计算机接口技术中。计算机与称重仪表就采用异步通信的方式传送数据。1.1异步串行通信的数据格式在这种通信方式中,一般以一个字符为一帧。一帧最少由三部分组成:起始位、数据位、停止位,开始是一位起始位以发送一个逻辑“0”表示,接着是表示这个数据的数据位,数据位可以是5位、6位、7位或8位,再加一位奇偶校验位,然后是一个、一个半或二个停止位,停止位以逻辑“1”表示。1.2波特率串行通信每秒传送的位数,传送时先低位后高位。常用的波特率有600、1200、2400、4800、9600等。1.3端口在计算机中,一般都配有两个标准串行口,用COM1和COM2表示。(通常采用2个9针D型阳性插头。)1.4信号线RS—232C标准规定有25根连线,使用21个信号线。在我们讨论的微机电子衡器中仅用到3根信号线,它们是:发送数据线TXD(输出信号),接受数据线RXD(输入信号线),信号地GND。其余信号线定义可参考相关书籍。2串行通信在电子衡器中的应用实例串行通信接口设计,包括硬件、软件设计两部分。在WINDOWS操作系统下,可选用VC++、VB等可视化开发工具。下面将以上海耀华称重系统公司的XK3190—A1+为例,以VB6.0编程语言,说明串行通信的软、硬件设计过程。 2.1称重仪表仪表选用上海耀华XK3190-A1+仪表,其串口通信格式如下:2.1.1连续方式发送:所传送的数据为仪表显示的当前称量(毛重或净重),每帧数据由12组数据组成。 第X组 内容及注释 1 02(XON)开始 2 +或- 符号位 3 称量数据高位 : 称量数据: : 称量数据: 8 称量数据低位 9

异步串行UART协议详解 中文版

异步串行UART协议

7.1.1 串行口的结构
2个物理上独立的接收、发送缓冲器SBUF,占用同一地 个物理上独立的接收、发送缓冲器 个物理上独立的接收 , 址99H ;接收器是双缓冲结构 。

7.1.2 串行口的控制
1、串行口控制寄存器SCON (98H)
设定工作方式、接收 发送控制以及设置状态标志 设定工作方式、接收/发送控制以及设置状态标志 SCON (98H)
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0、SM1:工作方式设置位 、 :

SM2,多机通信控制位。 ,多机通信控制位。
主要用于方式2和方式 。 主要用于方式 和方式3。对于接收机 和方式 SM2=0,收到 ,收到RB8(0或1)既可使收到的数据进入 ( 或 )既可使收到的数据进入SBUF, , 并激活RI。 并激活 。 SM2=1,收到的 信息丢弃, ,收到的RB8=0时,收到的信息丢弃,不激活 ; = 时 收到的信息丢弃 不激活RI 若收到的RB8=1时,收到的数据进入 数据进入SBUF,并激活 ,进而 若收到的 = 时 收到的数据进入 ,并激活RI, 读走。 在中断服务中将数据从 读走 在中断服务中将数据从SBUF读走。 方式0时 必须是0。 方式 时,SM2必须是 。 必须是 方式1时 才激活。 方式 时,SM2=1时,只有接收到有效停止位时,RI才激活。 时 只有接收到有效停止位时, 才激活
REN,允许串行接收位。 ,允许串行接收位。
置REN=1,启动串口接收过程 , 置REN=0,则禁止串口接收 ,

完整的串口信号解释

RXD、TXD是Receive Data ,Transmit Data 的意思。 RXD 为接收数据的引脚,TXD 为发送数据的引脚。 RXD在DTE设备端为接收,即输入, 在DCE设备端同名RXD为发送端,即输出。 在一对通讯系统中RXD信号在DTE设备端为输入信号,在DCE设备端为输出信号。原英文解释是综合译法,一般我们说的RXD是DTE端,即输入。 DTE设备:计算机、工程主机 DCE设备:调制解调器、个别仪表 DTR:数据终端就绪 Data Terminal Ready DTR( Data Terminal Ready ),数据终端就绪的首字母缩略词。例如,在串行通信中使用的一个信号,通过计算机发送到调制解调器上,以表明计算机已经准备就绪,可以接收未来的传输。 DSR(data set ready)即:数据准备就绪,是RS232中的一握手信号。当调制/解调器启动时,在经过自身检测后,用DSR来声明已经准本就绪。因此它是调制/解调器的输出,同时也是DTE(数据终端设备)的输入,该信号低电平有效。不管任何原因导致调制/解调器不能联通到电话,该信号都将保持无效状态以向DTE表明它不能接受和发送数据 解释二: RTS:终端我准备发数据给你,快用CTS应答,准备好没? CTS:好了,来吧 解释三: CTS:主机,我有数据,请求接收 RTS:我是主机,就绪,请求发送。 https://www.360docs.net/doc/ad145952.html, 二是RS232标准 三是MODEM的硬件流控 SIMCOM公司的解释完全正确 很久很久以前,计算机还没有出现,那时就已经存在了(计算机)史前的串口设备(电传打字机,工控测量设备,通信调制解调器),为了连接这些串口,EIA制定了RS232标准,采

相关文档
最新文档