完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在PX2开发板上有个已引出的的ttys3,大家如果用PX2来开发或者学习,时不时总是会需要用到这个串口的,而在android系统中,使用串口的方式也很简单,因为在PX2的源码中已经有了ttys3的驱动,我们只需要将起编译进内核(编译fangshihttp://bbs.chipspark.com/forum.p ... =%E4%B8%B2%E5%8F%A3)就可以像操作文件一样,操作这个串口,然后操作这个串口的时候,我们需要做的也只有先做个初始的配置,就是设置波特率,停止位,数据位,奇偶校验。
注:ttys3的连接如果是DB9脚的,理论上只连接RX ,TX,GND便可工作。楼主便是用这个的 1.串口的配置, 串口的配置是利用POSIX终端的termios结构 termios 结构定义如下 struct termios { tcflag_t c_iflag /* 输入选项标志 */ tcflag_t c_oflag /* 输出选项标志 */ tcflag_t c_cflag /* 控制选项标志 */ tcflag_t c_lflag /* 本地选项标志 */ cc_t c_cc[NCCS] /* 控制特性 */ } 而部分参数的作用参考附件中的内容
Linux下串口编程-非常全面-精品.txt.zip
(12.2 KB, 下载次数: 0
)
核心主要配置波特率,校验位,数据位,停止位, 而楼主自己写的驱动如下,其中的设置为波特率115200,无效验,八位数据位,一位停止位, #include #include #include #include #include #include #include #include #include int OpenDev(char *Dev){ int fd = open( Dev, O_RDWR ) if (-1 == fd){ perror("Can't Open Serial Port") return -1 } else return fd } int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop){ struct termios newios,oldios if(tcgetattr(fd, &oldios)!=0){ //获取之前定义的终端值 perror("setupserial 1") return -1 } bzero(&newios,sizeof(newios))//将newios结构体里的数据重新设置为0 newios.c_cflag|=CREAD//使能读和 newios.c_cflag&=~CSIZE//字符长度掩码 switch(nBits){ case 7:newios.c_cflag|=CS7break case 8:newios.c_cflag|=CS8break } switch(nEvent){ case '0': newios.c_cflag|=PARENB newios.c_cflag|=PARODD newios.c_cflag|=(INPCK|ISTRIP)//偶校验 break case '1': newios.c_cflag|=PARENB newios.c_cflag&=~PARODD//奇校验 break case 'N': newios.c_cflag&=~PARENB//无校验 break } switch(nSpeed){//设置波特率 case 2400: cfsetispeed(&newios,B2400) cfsetospeed(&newios,B2400) break case 4800: cfsetispeed(&newios,B4800) cfsetospeed(&newios,B4800) break case 9600: cfsetispeed(&newios,B9600) cfsetospeed(&newios,B9600) break case 115200: cfsetispeed(&newios,B115200) cfsetospeed(&newios,B115200) break default: cfsetispeed(&newios,B115200) cfsetospeed(&newios,B115200) break } if(nStop==1) newios.c_cflag&=~CSTOPB//一停止位 else if (nStop==2) { newios.c_cflag|=CSTOPB//两停止位 newios.c_cc[VTIME]=0//无延时 newios.c_cc[VMIN]=0//无附加 tcflush(fd,TCIOFLUSH)//刷新输出队列 } newios.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO)//原始数据输入 newios.c_oflag &= ~OPOST//原始数据输出 if(tcsetattr(fd,TCSANOW,&newios)!=0)//将配置赋予POSIX终端 { perror("com set error") return -1 } printf("set donen") return 0 } int main(int argc, char **argv){ int fd int nread,nwrite char buff[8] char *dev = "/dev/ttyS3" //串口3 char bufsend[8] fd = OpenDev(dev) if (set_opt(fd,115200,8,'N',1) == FALSE) { printf("Set Parity Errorn") exit (0) } memset(buff,0,8*sizeof(char)) if(strcmp(argv[1],"receive")==0) { while(1){ while((nread = read(fd, buff, 8))>0) //读数据,在死循环中不断等待,输出数据, { printf("receive %d ",nread) printf( "n%s", buff) }}} memset(bufsend, 0,8*sizeof(char))//清空数据栈 if(strcmp(argv[1],"send")==0){//发送数据,类型字符 printf("send message: ") fgets(bufsend,8,stdin) printf("n%s",bufsend) nwrite=write(fd,bufsend,8) } close(fd) exit (0) } 2.程序测试, 确认连接无误后,楼主开始发送数据,但是,虽然正常实现串口的通信,但是发送的数据却是乱码,一开始楼主发送了111111111111,而接受到的数据是ggggggggggg,其接收到的即不是ascii码,而对应的十六进制是67,具体的问题楼主还在研究,估计还得过段时间,才能解决这个问题,按楼主的估计可能性有两个,一个是楼主是使用DB9接口的,只连了三根线,并没有VCC,会不会是这个有影响,二,楼主配置串口时,只做了基本配置,或许是某个配置出错了。这里先放到论坛上分享给大家,后续再继续补充,与大家共勉。 串口调试助手:
sscom32.rar
(274.99 KB, 下载次数: 0
)
|
|
相关推荐
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard ELF 1板卡-CAN编程示例之开发板测试
678 浏览 0 评论
该问题是用APP给芯海科技的CST92F25芯片发指令是出现的
2286 浏览 1 评论
789 浏览 0 评论
1553 浏览 1 评论
2306 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 19:22 , Processed in 0.634039 second(s), Total 67, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号