文档章节

【Rayeager PX2分享】PX2上ttys3串口测试程序编写

穿
 穿prada的008
发布于 2015/07/02 17:25
字数 1025
阅读 49
收藏 0

在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

© 著作权归作者所有

穿
粉丝 0
博文 51
码字总数 24172
作品 0
福州
私信 提问
Rayeager PX2开发板上的串口UART3使用入门

UART3在此图上左半区(http://wiki.chipspark.com/cn/ind ... 5%E5%8F%A3%E5%9B%BE),在GPIO扩展这组接口中,UART3是最容易连接外扩的一个串口(TTL电平),开发中需要接一些串口的外围器件...

穿prada的008
2015/01/26
143
0
Rayeager PX2 1GB/2GB增强版上市

Rayeager PX2 开发板采用Rockchip PX2处理器,内置双核ARM Cortex-A9核心,内存:1GB DDR3@400MHz,最高运行频率1.4GHz,配备Mali-400 MP4 GPU,支持OpenGL ES 1.1/2.0和OpenVG 1.1,同时支持...

穿prada的008
2014/09/15
332
1
独领风骚:Rayeager PX2高性能开发板的八大特性

Rayeager PX2是首款采用Rockchip PX2高性能AP的开源开发板,这款采用双核Cortex A9,频率高达1.4GHz的板子是Rcokchip与Chipspark智能设备驱动平台的首次结合。 出身Rcokchip的这款板子主要被...

超级丹
2014/10/28
192
0
Rayeager PX2开发板Ubuntu系统V1.0 beta版

将大于4GB的U盘插入ubuntu主机 fdisk -l 得到U盘的盘符,假设为/dev/sdc dd bs=4M if=px2_linaro_ubuntu.img of=/dev/sdc 重新拔插U盘 fdisk -l 查看u盘分区表情况,存储ubuntu系统的分区应该是...

穿prada的008
2015/01/29
49
0
Rayeager px2 芯片详解

瑞芯微近期低调推出一款SOC芯片,基于双核Cortex-A9核心,主频1.4GHz,搭配GPU:Mali-400。初看上去与RK3066很相似,起初我并没有找到很多关于PX2芯片的资料,但是芯客网ChipSPARK推出了一款基...

穿prada的008
2014/11/14
2.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

秒杀系统思路

业务分析 技术挑战 请求响应要快:无论成功失败,需要尽快返回给用户 架构设计   前端:静态化   站点层:限制请求数   服务层:乐观锁写缓存   数据库CAP:读写高可用,一致性,扩容...

雷开你的门
23分钟前
10
0
最全的教育行业大数据解决方案,个个针对痛点

大数据的悄然兴起也带动了教育行业的革新,移动教育、云课堂等的出现,使得教育行业再次成为了可以中长期保持高景气的行业。然而,初涉数据领域的教育行业同时也面临着相当大的难题,还需要更...

朕想上头条
27分钟前
7
0
预约模块设计分析

1.预约功能描述: 预约是小程序中常见的一种商品管理系统,商家可根据商品或服务的特性,灵活设置预约细节,为用户提供线上预约服务,如场地预约,商品预定等,实现高效经营。 预约场景: ...

鱼煎
30分钟前
5
0
阿里云日志服务构建网站实时分析大盘实战

场景分析 挖掘数据价值是当前企业级网站共同面临的问题。买买网是一个电商平台网站,每天拥有大量的用户访问和购买记录。为了引导用户直接消费,提升购买率和转化率,不同的用户类别需要推荐...

阿里云官方博客
31分钟前
3
0
TL665xF-EasyEVM开发板硬件处理器、NAND FLASH、RAM

广州创龙结合TI KeyStone系列多核架构TMS320C665x及Xilinx Artix-7系列FPGA设计的TL665xF-EasyEVM开发板是一款DSP+FPGA高速大数据采集处理平台,其底板采用沉金无铅工艺的6层板设计,适用于高...

Tronlong创龙
35分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部