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

在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

时间: 2024-10-03 14:00:38

【Rayeager PX2分享】PX2上ttys3串口测试程序编写的相关文章

【Rayeager PX2分享】最简单helloworld驱动编写

论坛里应该有一部分人是想学驱动,却不知道该怎么入门吧,在这里我教大家写一个helloworld的简单随linux内核加载的驱动. 1.首先在/kernel/drivers下建一个新的文件夹hello,在文件夹里添加四个文件分别是hello.c,hello.hKconfig,Makefile, hello.c文件里也有注释,这个文件主要就是为了注册和初始化设备文件以及定义驱动接口,主要是用啦file_operations这个结构体,大家想了解驱动可以先了解这个,这个程序里的注释可以帮助大家理解下一

飞凌ok6410的串口测试程序

  调了好几天,问题很奇葩 不过最终还是解决了,先上代码吧 #include <stdio.h>/*标准输入输出定义*/ #include <stdlib.h>/*标准函数库定义*/ #include <unistd.h>/*UNIX标准函数定义*/ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>/*文件控制定义*/ #include <termio

【Rayeager PX2分享】修改安卓开机后进入主屏幕流程分析

在之前楼主在学习了Android的启动流程后,继续学了下去,然后看了上面这位博主的分享,便对修改主屏有明确思路了 开始尝试修改开机后首次进入的界面,首先楼主先写了一个简单的apk,主要最初默认的程序中在AndroidMain里fiter里加了句 <category android:name="android.intent.category.HOME" />主要在android启动后选择主屏幕可以找到这个apk. 显示hello PX2样子如下 生成apk,然后在linux环

【Rayeager PX2分享】解决px2开发板的usb转串口不可用问题

本人在使用px2开发板的usb作为串口时遇到问题,在/dev目录下有出现ttyusb0,但不可用.注:没有插上串口线是不会出现ttyusb0的. 解决办法如下: 1.请用本帖提供的usb-serial.c与usb-serial.h文件替换px2所自带的文件.文件路径如下:/home/zoubin/sdk/kernel/drivers/usb/serial. 2.进入kernel目录下,进行make menuconfig来配置内核编译选项.选项如下:Devces drivers-->USB seu

【Rayeager PX2】PX2上使用GPIO口的例程

之前楼主在论坛中已经分享了简单驱动的编写,现在楼主再来教刚接触板子的新手们如何引用调用GPIO,不过这里楼主并没有将GPIO口的函数封装成库,然后在eclipse上调用,楼主这边的例子,只是简单的用adb工具进入板中,然后用一个测试程序使用端口,有兴趣想要在安卓界面调用端口的,可以参考楼主之前写的那编jni调用的帖子. 首先我们依旧来简单地说下步骤, 1.在/kernel/drivers下建个文件夹,自己创建并添加Kconfig和makefile,内容如下, 2.在该目录下写个gpio驱动,内容

【Rayeager PX2分享】OpenCV入门之线段检测

线段检测主要运用Hough变换,Hough变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段). 在OpenCV编程中,实现线段检测主要使用cvHoughLines2函数. 函数原型: CvSeq* cvHoughLines2( CvArr* image, void* line_storage, int method, double rho, doubl

PX2分享Android预设桌面定制与电量图标修改以及版本更改

目前桌面使用google默认使用Launche2,源代码位置为:sdk/packages/apps/Launcher2, 桌面快捷方式在:sdk/packages/apps/Launcher2/res/xml/default_workspace.xml中修改.如图: 其中: launcher:screen="1"为:第几屏: launcher:x="0" launcher:y="3"   为:x/y坐标: launcher:spanX="

appbox之: linux串口测试程序

平台:从网上买的X86平台(baytrail -D (cerelon J1900)) Baytrail平台自带两个串口,基本上就是低端台式机的配置 串口也是同台式机一样 问题:这里将这个X86平台(baytrail cerelon J1900)当成从机设备, 将其接到PC的串口上,一直无输出 解决:串口线两端都是母头,也就是说是直连的,那么这样,baytrail的tx直接与PC的tx相接 所以调了很久都没有任何输出,问题就在于BYT的TX与PC的TX相接,导致PC上看不到BYT设备的输出 所以,

go9go链接平台推广手段吐血分享(上)

写这篇文章前我考虑很久,是否应该把go9go用过的推广手段毫无保留的分享出来,因为推广手段都分享出来了,竞争对手就会去模仿,对go9go的发展难免会有影响.前段时间也在微博上发帖征求博友的建议,其中一个博友的回复让我印象深刻.说:"推广经验分享出去,并不代表别人就都能学过去,就像一个班级里,同样的老师,同样的教材,但是成绩有高低,更多还是看每个人自己的学习能力".        还有之前在网上看到有人戏说唐骏的励志书籍<我的成功可以复制>但不能粘贴.突然觉得做网络推广也是同