我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1687|回复: 0

[技术文章] 【Rayeager PX2分享】PX2上ttys3串口测试程序编写

[复制链接]

该用户从未签到

36

主题

1

回帖

33

积分

一级逆天

积分
33

社区居民

QQ
发表于 2015-7-2 18:02:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在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

核心主要配置波特率,校验位,数据位,停止位,
而楼主自己写的驱动如下,其中的设置为波特率115200,无效验,八位数据位,一位停止位,

#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
#include <linux/kernel.h>

    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 done\n")
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
回复

使用道具 举报

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

本版积分规则

公告:服务器刚移机,
大家请不要下载东西。
会下载失败


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表