[ZLG-ARM] 学习串口制作以及linux下的串口编程实例

[复制链接]
2903|3
 楼主| lpczcy 发表于 2009-6-22 13:55 | 显示全部楼层 |阅读模式
代码:<br />#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*标准输入输出定义*/#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*标准函数库定义*/#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*Unix标准函数定义*/#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**/#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**/#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*文件控制定义*/#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*PPSIX终端控制定义*/#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*错误号定义*//***@brief&nbsp;&nbsp;设置串口通信速率*@param&nbsp;&nbsp;fd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型&nbsp;int&nbsp;&nbsp;打开串口的文件句柄*@param&nbsp;&nbsp;speed&nbsp;&nbsp;类型&nbsp;int&nbsp;&nbsp;串口速度*@return&nbsp;&nbsp;void*/int&nbsp;speed_arr[]&nbsp;=&nbsp;{&nbsp;B38400,&nbsp;B19200,&nbsp;B9600,&nbsp;B4800,&nbsp;B2400,&nbsp;B1200,&nbsp;B300,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B38400,&nbsp;B19200,&nbsp;B9600,&nbsp;B4800,&nbsp;B2400,&nbsp;B1200,&nbsp;B300,&nbsp;};int&nbsp;name_arr[]&nbsp;=&nbsp;{38400,&nbsp;&nbsp;19200,&nbsp;&nbsp;9600,&nbsp;&nbsp;4800,&nbsp;&nbsp;2400,&nbsp;&nbsp;1200,&nbsp;&nbsp;300,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;38400,&nbsp;&nbsp;19200,&nbsp;&nbsp;9600,&nbsp;4800,&nbsp;2400,&nbsp;1200,&nbsp;&nbsp;300,&nbsp;};void&nbsp;set_speed(int&nbsp;fd,&nbsp;int&nbsp;speed){&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;i;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;status;&nbsp;&nbsp;struct&nbsp;termios&nbsp;&nbsp;&nbsp;Opt;&nbsp;&nbsp;tcgetattr(fd,&nbsp;&Opt);&nbsp;&nbsp;for&nbsp;(&nbsp;i=&nbsp;0;&nbsp;&nbsp;i&nbsp;&lt&nbsp;sizeof(speed_arr)&nbsp;/&nbsp;sizeof(int);&nbsp;&nbsp;i++)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;(speed&nbsp;==&nbsp;name_arr)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcflush(fd,&nbsp;TCIOFLUSH);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfsetispeed(&Opt,&nbsp;speed_arr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfsetospeed(&Opt,&nbsp;speed_arr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;tcsetattr(fd,&nbsp;TCSANOW,&nbsp;&Opt);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;(status&nbsp;!=&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror('tcsetattr&nbsp;fd1');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;tcflush(fd,TCIOFLUSH);&nbsp;&nbsp;&nbsp;}}/***@brief&nbsp;&nbsp;&nbsp;设置串口数据位,停止位和效验位*@param&nbsp;&nbsp;fd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型&nbsp;&nbsp;int&nbsp;&nbsp;打开的串口文件句柄**@param&nbsp;&nbsp;databits&nbsp;类型&nbsp;&nbsp;int&nbsp;数据位&nbsp;&nbsp;&nbsp;取值&nbsp;为&nbsp;7&nbsp;或者8**@param&nbsp;&nbsp;stopbits&nbsp;类型&nbsp;&nbsp;int&nbsp;停止位&nbsp;&nbsp;&nbsp;取值为&nbsp;1&nbsp;或者2**@param&nbsp;&nbsp;parity&nbsp;&nbsp;类型&nbsp;&nbsp;int&nbsp;&nbsp;效验类型&nbsp;取值为N,E,O,,S*/int&nbsp;set_Parity(int&nbsp;fd,int&nbsp;databits,int&nbsp;stopbits,int&nbsp;parity){&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;termios&nbsp;options;&nbsp;if&nbsp;&nbsp;(&nbsp;tcgetattr(&nbsp;fd,&options)&nbsp;&nbsp;!=&nbsp;&nbsp;0)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror('SetupSerial&nbsp;1');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(FALSE);&nbsp;&nbsp;}&nbsp;&nbsp;options.c_cflag&nbsp;&=&nbsp;~CSIZE;&nbsp;&nbsp;switch&nbsp;(databits)&nbsp;/*设置数据位数*/&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;7:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;|=&nbsp;CS7;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;8:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;|=&nbsp;CS8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,'Unsupported&nbsp;data&nbsp;size\n');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(FALSE);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;switch&nbsp;(parity)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'n':&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'N':&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;&=&nbsp;~PARENB;&nbsp;&nbsp;&nbsp;/*&nbsp;Clear&nbsp;parity&nbsp;enable&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_iflag&nbsp;&=&nbsp;~INPCK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Enable&nbsp;parity&nbsp;checking&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'o':&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'O':&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;|=&nbsp;(PARODD&nbsp;|&nbsp;PARENB);&nbsp;&nbsp;/*&nbsp;设置为奇效验*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_iflag&nbsp;|=&nbsp;INPCK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Disnable&nbsp;parity&nbsp;checking&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'e':&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'E':&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;|=&nbsp;PARENB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Enable&nbsp;parity&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;&=&nbsp;~PARODD;&nbsp;&nbsp;&nbsp;/*&nbsp;转换为偶效验*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_iflag&nbsp;|=&nbsp;INPCK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Disnable&nbsp;parity&nbsp;checking&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'S':&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'s':&nbsp;&nbsp;/*as&nbsp;no&nbsp;parity*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;&=&nbsp;~PARENB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;&=&nbsp;~CSTOPB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,'Unsupported&nbsp;parity\n');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(FALSE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;/*&nbsp;设置停止位*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(stopbits)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;&=&nbsp;~CSTOPB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cflag&nbsp;|=&nbsp;CSTOPB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,'Unsupported&nbsp;stop&nbsp;bits\n');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(FALSE);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;/*&nbsp;Set&nbsp;input&nbsp;parity&nbsp;option&nbsp;*/&nbsp;&nbsp;if&nbsp;(parity&nbsp;!=&nbsp;'n')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.c_iflag&nbsp;|=&nbsp;INPCK;&nbsp;&nbsp;&nbsp;&nbsp;options.c_cc[VTIME]&nbsp;=&nbsp;150;&nbsp;//&nbsp;15&nbsp;seconds&nbsp;&nbsp;&nbsp;&nbsp;options.c_cc[VMIN]&nbsp;=&nbsp;0;&nbsp;&nbsp;tcflush(fd,TCIFLUSH);&nbsp;/*&nbsp;Update&nbsp;the&nbsp;options&nbsp;and&nbsp;do&nbsp;it&nbsp;NOW&nbsp;*/&nbsp;&nbsp;if&nbsp;(tcsetattr(fd,TCSANOW,&options)&nbsp;!=&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror('SetupSerial&nbsp;3');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(FALSE);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;return&nbsp;(TRUE);&nbsp;}/***@breif&nbsp;打开串口*/int&nbsp;OpenDev(char&nbsp;*Dev){int&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;=&nbsp;open(&nbsp;Dev,&nbsp;O_RDWR&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//|&nbsp;O_NOCTTY&nbsp;|&nbsp;O_NDELAY&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(-1&nbsp;==&nbsp;fd)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;/*设置数据位数*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror('Can't&nbsp;Open&nbsp;Serial&nbsp;Port');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;fd;}/***@breif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main()*/int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;fd;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nread;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;buff[512];/*&nbsp;打开串口&nbsp;*&nbsp;在&nbsp;Linux&nbsp;下串口文件是位于&nbsp;/dev&nbsp;下的&nbsp;&nbsp;*&nbsp;串口一为/dev/ttyS0,串口二为/dev/ttyS1&nbsp;&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*dev&nbsp;='/dev/ttyS1';/*&nbsp;打开串口是通过使用标准的文件打开函数操作:&nbsp;&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;=&nbsp;OpenDev(dev);&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(fd&gt0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_speed(fd,19200);&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('Can't&nbsp;Open&nbsp;Serial&nbsp;Port!\n');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;if&nbsp;(set_Parity(fd,8,1,'N')==&nbsp;FALSE)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;printf('Set&nbsp;Parity&nbsp;Error\n');&nbsp;&nbsp;&nbsp;&nbsp;exit(1);&nbsp;&nbsp;}&nbsp;&nbsp;while(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((nread&nbsp;=&nbsp;read(fd,buff,512))&gt0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('\nLen&nbsp;%d\n',nread);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff[nread+1]='\&nbsp;0';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('\n%s',buff);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//close(fd);&nbsp;&nbsp;&nbsp;&nbsp;//exit(0);}<br />&nbsp;<br /> &nbsp;&nbsp;<br />
arminfo 发表于 2009-6-22 14:07 | 显示全部楼层

谢啦,又学到新的东西了

  
miclinux 发表于 2009-6-24 13:18 | 显示全部楼层

  
qtopia 发表于 2009-7-2 13:06 | 显示全部楼层

有没有好的例子呢?你这个好乱

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

77

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部