9`jcC-;iv 在PX2开发板上有个已引出的的ttys3,大家如果用PX2来开发或者
学习,时不时总是会需要用到这个串口的,而在android系统中,使用串口的方式也很简单,因为在PX2的
源码中已经有了ttys3的
驱动,我们只需要将起编译进内核(编译fangshihttp://bbs.chipspark.com/forum.p ... =%E4%B8%B2%E5%8F%A3)就可以像操作文件一样,操作这个串口,然后操作这个串口的时候,我们需要做的也只有先做个初始的配置,就是设置波特率,停止位,数据位,奇偶校验。
IKtB; 注:ttys3的连接如果是DB9脚的,理论上只连接RX ,TX,GND便可工作。楼主便是用这个的
hmx=
35 1.串口的配置,
@D-AO_ 串口的配置是利用POSIX终端的termios结构
7"7rmZ termios 结构定义如下
)%SkJ struct termios
IX: 25CEI2 {
mNf8kwr tcflag_t c_iflag /* 输入选项标志 */
g~7Ri-" tcflag_t c_oflag /* 输出选项标志 */
yc2/~a_Gx tcflag_t c_cflag /* 控制选项标志 */
9jN)I(^D6 tcflag_t c_lflag /* 本地选项标志 */
nJRS.xs cc_t c_cc[NCCS] /* 控制特性 */
6Ao%>;e* }
R1F5-#?'E 而部分参数的作用参考附件中的内容
Linux下串口编程-非常全面-精品.txt.zip *`j-i 核心主要配置波特率,校验位,数据位,停止位,
7&`}~$>}>e 而楼主自己写的驱动如下,其中的设置为波特率115200,无效验,八位数据位,一位停止位,
fP3_d <9=9b_z #include <stdio.h> /*标准输入输出定义*/
8ul&x~2;X #include <stdlib.h> /*标准函数库定义*/
ml@2wGyf #include <unistd.h> /*Unix 标准函数定义*/
0JgL2ayIVI #include <sys/types.h>
{T"0DSV #include <sys/stat.h>
*Ype>x{ #include <fcntl.h> /*文件控制定义*/
#-3=o6DCK #include <termios.h> /*PPSIX 终端控制定义*/
)
\Y7& #include <errno.h> /*错误号定义*/
-",=G\XZ #include <linux/kernel.h>
-p-B2?)A K =.%$A int OpenDev(char *Dev){
Cv$
SJc j8|g!>Nv int fd = open( Dev, O_RDWR )
k5kdCC0FCk if (-1 == fd){
@i^~0A#q* perror("Can't Open Serial Port")
yCJ Fo return -1
iv phlw }
@
S <-d else
tvXW return fd
Z5c~^jL$- }
v+jsC`m int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop){
Ladsw struct termios newios,oldios
kc/{[ME if(tcgetattr(fd, &oldios)!=0){ //获取之前定义的终端值
*. 3N=EO perror("setupserial 1")
0-LpqX return -1
7?B.0>$3>V }
pV6d
Id bzero(&newios,sizeof(newios))//将newios结构体里的数据重新设置为0
9]t[J_YM newios.c_cflag|=CREAD//使能读和
2+Px'U\ newios.c_cflag&=~CSIZE//字符长度掩码
0!z@2[Pe66 switch(nBits){
p3/*fH98 case 7:newios.c_cflag|=CS7break
CG'.:`t case 8:newios.c_cflag|=CS8break
d:G]1k;z SI:U0gUc 9N%JP+<89 }
{JV@"t-X3" switch(nEvent){
gyS+9)gY case '0':
nm7;ieMfr newios.c_cflag|=PARENB
zI~owK)%Z newios.c_cflag|=PARODD
!_2n newios.c_cflag|=(INPCK|ISTRIP)//偶校验
RzhWD^b B break
CF|]e: case '1':
DO7W}WU newios.c_cflag|=PARENB
?PTk1sB newios.c_cflag&=~PARODD//奇校验
(Qgde6 break
`.y}dh/+0W case 'N':
3:%QB9qc]' newios.c_cflag&=~PARENB//无校验
1b8p~-LsU break
]pEV}@7 uP\lCqK, }
Bx[rC switch(nSpeed){//设置波特率
^IKO2Ft case 2400:
&D%(~|' cfsetispeed(&newios,B2400)
7u\*_mrv cfsetospeed(&newios,B2400)
K/ &?VIi`z break
}HEvr)v9 case 4800:
\:>
Wpqw cfsetispeed(&newios,B4800)
e T'nl,e| cfsetospeed(&newios,B4800)
W4;m H}#0 break
P,ua<B}L case 9600:
[P|[vWO cfsetispeed(&newios,B9600)
WWT",gio cfsetospeed(&newios,B9600)
zo;^m| break
C0=9K@FCb case 115200:
B=
keBO](@ cfsetispeed(&newios,B115200)
OL7_'2_z. cfsetospeed(&newios,B115200)
8+mH:O break
E&yD8=vw default:
74<!&t cfsetispeed(&newios,B115200)
C8a*Q" cfsetospeed(&newios,B115200)
)m3q2W break
@?C#r.vgp }
PiFD^w if(nStop==1)
y80ykGPT\& newios.c_cflag&=~CSTOPB//一停止位
zU6a'tP else if (nStop==2)
3Q/#T1@ {
0oy-os newios.c_cflag|=CSTOPB//两停止位
wPbkUVO newios.c_cc[VTIME]=0//无延时
[6jbgW~E newios.c_cc[VMIN]=0//无附加
T+LJ*I4 tcflush(fd,TCIOFLUSH)//刷新输出队列
$o@R^sJ }
p}Fs'l?7Rq [NnauItI newios.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO)//原始数据输入
iE0ab,OF newios.c_oflag &= ~OPOST//原始数据输出
_DRrznaw if(tcsetattr(fd,TCSANOW,&newios)!=0)//将配置赋予POSIX终端
F#xa`*AP {
VcK}2<8:+~ perror("com set error")
g%[n4 return -1
,n2i@?NHZ ;0ME+]`"3 }
Q bhW!9(, (Lh#`L?x printf("set done\n")
5)1+~ B return 0
4
;Qlu DOm[*1@^ }
8GJdRL( int main(int argc, char **argv){
dsK&U\ej} int fd
^GN8V-X4y int nread,nwrite
R)!`JKeO/ char buff[8]
,1Qd\8N9 char *dev = "/dev/ttyS3" //串口3
%u?HF4S' char bufsend[8]
Np)3+!^1" fd = OpenDev(dev)
X7UBopm& fbZibcQ%k if (set_opt(fd,115200,8,'N',1) == FALSE) {
$#o1MX printf("Set Parity Errorn")
ps1YQ3Ep& exit (0)
B68H&h]D#' }
3l!NG=R memset(buff,0,8*sizeof(char))
%R_{1GrL'c if(strcmp(argv[1],"receive")==0)
b
hjZ7= {
zIQzmvf while(1){
v4?iOD while((nread = read(fd, buff, 8))>0) //读数据,在死循环中不断等待,输出数据,
B~r}c4R{7 {
(k-YI{D3 printf("receive %d ",nread)
kL@Wb/K JP printf( "\n%s", buff)
gL$&@NY }}}
lp&!lb` memset(bufsend, 0,8*sizeof(char))//清空数据栈
Ex@`O+ if(strcmp(argv[1],"send")==0){//发送数据,类型字符
~>ME'D~ printf("send message: ")
-237Lx$/ fgets(bufsend,8,stdin)
i~=s^8n`l printf("\n%s",bufsend)
bggusK< p5c8YfM nwrite=write(fd,bufsend,8)
!7H6i#g* 1`r| op}, }
L3y5 a?G $]d*0^J 6 close(fd)
Qqs"?Z,P exit (0)
g: %9jf }
l_FGZ!7 _rQUE^9 2.程序测试,
p(3sgY1 确认连接无误后,楼主开始发送数据,但是,虽然正常实现串口的通信,但是发送的数据却是乱码,一开始楼主发送了111111111111,而接受到的数据是ggggggggggg,其接收到的即不是ascii码,而对应的十六进制是67,具体的问题楼主还在研究,估计还得过段时间,才能解决这个问题,按楼主的估计可能性有两个,一个是楼主是使用DB9接口的,只连了三根线,并没有VCC,会不会是这个有影响,二,楼主配置串口时,只做了基本配置,或许是某个配置出错了。这里先放到论坛上
分享给大家,后续再继续补充,与大家共勉。
7-iIay1h" f%^'P"R 串口调试助手:
/dHs &SU, sscom32.rar