ubuntu的USB应该是/dev/下面的一个文件,进行USB串口数据的发送和接收应该就是对这个文件进行写读操作就可以了。_ubuntu查看usb设备 对应的/dev下面的设备-程序员宅基地

技术标签: 串口网口(TCP/UDP)驱动编写  linux设备驱动  

ubuntu的USB应该是/dev/下面的一个文件,进行USB串口数据的发送和接收应该就是对这个文件进行写读操作就可以了。

linux一切皆文件嘛。

http://www.makeru.com.cn/video/386_2599.html

我感觉就算是up squared的GPIO口的输入输出操作,本质应该也是对某个文件的读写。

https://www.youtube.com/watch?v=vwGpF5VZ-yw

 

https://mp.weixin.qq.com/s/KaqA4mMbmq9AXnxgHWTAXQ

Linux下ARM和单片机的串口通信设计

原创 wonhere 华和技术 2016-04-15

 

  本文介绍Linux 环境下串口通信的设计方法和步骤,并介绍了ARM9 微处理器s3c2440 在Linux 下和C8051Fxxx 系列单片机进行串行通信的设计方法,给出了硬件连接和通信程序流程图。该方法可靠、实用,适用于大多数Linux ARM 和单片机串口通信的场合。

  

  数据采集系统中由于单片机侧重于控制,数据处理能力较弱,对采集的数据进行运算处理比较繁琐,如果通过串口与上位机通信,利用上位机强大的数据处理能力和友好的控制界面对数据进行处理和显示则可以提高设计效率。串口通信以其简单的硬件连接,成熟的通信协议,成为上下位机之间通信的首选。移植了Linux 操作系统的s3c2440 可以在Linux 环境下操作串口,降低了串口操作的难度,可以使开发者集中精力开发大规模的应用程序,而不必在操作底层设计上耗费时间。

 

      “ 1 硬件连接 ”

  s3c2440 是三星公司生产的基于ARM9 核的处理器,采用3.3 V 电压供电; C8051Fxxx 系列单片机是美国CYGNAL 公司推出的与8051 兼容的高性能高速单片机,采用3.3 V 电压供电。两者供电电压相同,所以进行串行口通信时不需要进行电平转换。硬件连接采用最常用的TXD,RXD,GND 三线连接方式。注意采用交叉连接方式,即TXDRXD,RXDTXD.

 

   “2 Linux 下串口通信”

  

    2.1 Linux 下串口设备描述

  s3c2440 上移植了Linux 2.6.32 操作系统,加载了s3c2440 的串口驱动程序,通过Linux 提供的串口操作函数和文件操作函数把对串口的操作等同于文件操作,降低了串口的操作难度,提高了效率。在程序中设备和文件都是通过文件描述符来操作的,文件描述符在Linux 内核中是一个非负整数。Linux 设备文件都存放在"/dev"目录下,串口也不例外,在/dev 中可以找到串口对应的设备文件,本文对应的串口1 的设备文件路径是"/dev /ttySAC1"。

 

  2.2 Linux 下串口通信程序设计

  串口通信需要设置一些参数,如波特率、数据位、停止位,输入输出方式等。这些参数都存在于Linux提供的termios 结构中,该结构是Linux 系统用于查询和操作各个终端的一个标准接口,定义在头文件< ter-mios. h > 中,如下所示:

  STruct termios{

  tcflag_t c_iflag; /* 输入标志* /

  tcflag_t c_oflag; /* 输出标志* /

  tcflag_t c_cflag /* 控制标志* /

  tcflag_t c_lflag /* 本地标志* /

  cc_t c_cc[NCCS]; /* 控制特性* /

  } ;

  Linux 串口通信步骤可分为以下三步,操作流程如图1 所示。

 

1

  打开串口

 

  调用open( ) 函数打开串口设备文件,若出错则返回- 1,成功则返回文件句柄。

  #define UART1 /dev /ttySAC1

  int fd;

  fd = open( "UART1",O_RDWR) /* 以可读可写方式打开串口设备* /

 

2

  设置串口属性

  

  函数tcsetattr ( ) 可以设置串口的结构属性,tcgetatt( ) 可以得到串口的结构属性。在termios 结构中,最重要的是c_cflag,用户通过对其进行赋值可以实现串口波特率、数据位、停止位、奇偶校验位等参数的设置。c_cc 数组中的两个变量VMIN 和VTIME 判断是否返回输入,c _cc[VTIME]设定字节输入时间计时器,c _cc[VMIN]设定满足读取功能的最低接收字节数。这两个变量的值要设定合理,才能保证串口的通信成功率。

  int set_attr( int fd)

  {

  struct termios newtio,oldtio;

  tcgetattr( fd,&oldtio) ;

  cfsetispeed( &newtio,B9600) ; /* 设置读波特率为9600* /

  cfsetospeed( &newtio,B9600) ; /* 设置写波特率为9600* /

  memset( &newtio,0

  , sizeof( newtio) )

  ;

  newtio. c_cflag = CS8 | CREAD; /* 设置数据位为8 位并且使能接收* /

  newtio. c_cflag & = ~ PARENB; /* 不进行奇偶校验* /

  newtio. c_cflag & = ~ CSTOPB; /* 1 位停止位* /

  newtio. c_cc[VMIN]= 1; /* 当接收到一个字节数据就读取* /

  newtio. c_cc[VTIME]= 0; /* 不使用计时器* /

  tcflush( fd,TCIOFLUSH) ; /* 刷清输入输出缓冲区* /

  tcsetattr( fd,TCSANOW,&newtio) /* 使设置的终端属性立即生效* /

  }

  

3

 串口读写,串口关闭

    

  设置完通信参数后,就可以用标准的文件读写命令read( ) 和write( ) 操作串口了。最后在退出之前,用close( ) 函数关闭串口。

  void rd_wr( )

  {

  write( fd,wbuf,10) ;

  usleep( 500000) ; /* 延时50 ms 等待下位机发送数据* /

  read( fd, rbuf,10) ;

  printf( "read string is %s \n", rbuf) ;

  }

 

 

  “3 通信程序设计”

  ARM 与单片机的串口通信程序包括两方面: 一方面是作为上位机的ARM 的串口通信程序,另一方面是作为下位机的单片机的串口通信程序。在通信之前必须制定合理的通信协议以保证通信的可靠性和成功率。现约定双方通信协议如下:

  (1) 波特率为9600 bit /s,帧格式为1 - 8 - N - 1( 1 位起始位,8位数据位,无奇偶校验,1位停止位);(2) 由于上位机ARM 的速度远远高于下位机单片机的速度,所以采用上位机主动联络,下位机等待的方式。在数据传送前ARM 先发送联络信号/0xaa,单片机收到后回答一个/0xbb,表示可以发送,否则继续联络;(3) 单片机端可以有中断和查询方式收发串口数据。本文采用中断方式;(4) ARM 处理器s3c2440 采用UART1 和单片机通信,UART0 则作为s3c2440 终端控制台。

 

  3.1 上位机ARM 的通信程序设计

由于s3c2440 移植了定制和裁剪后的Linux2.6.32内核的操作系统,对串口的操作采用上述的Linux 下串口操作方法,程序流程图如图2 所示。

 

 

 

      3.2 下位机单片机的通信程序设计

  选用C8051F021 的定时器T1 作为波特率发生器,晶振采用11.0592 MHz,定时器工作在方式2,计数初值为0xfd,串口工作在串行方式1( 1 - 8 - N - 1) ,采用中断方式收发数据。程序流程图如图3 所示。

 

 

  Linux 下的串口通信程序在PC 机Linux RHEL5下用arm - linux - gcc 4.4.3 交叉编译工具编译通过NFS 挂载在s3c2440 上运行,单片机端的通信程序用Cygnal 的集成开发环境( IDE ) 编译并下载到C8051F021 中运行。

 

 

 

https://wenku.baidu.com/view/2a05acea770bf78a65295436.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_16643223/article/details/107927434

智能推荐

【AI折腾录】stable web ui基础【sd安装、lora vae embedding hyperwork等基础概念】_sd vae怎么安装-程序员宅基地

文章浏览阅读4.3k次,点赞3次,收藏9次。简单过了下不同文件类型和使用方法,着重尝试了Lora,毕竟是当前阶段最火的东西。接下来会逐步深入学习其他技术。_sd vae怎么安装

解决IDEA启动tomcat时候tomcat catalina log控制台显示乱码_tomcat catakina log乱码-程序员宅基地

文章浏览阅读931次,点赞2次,收藏4次。[转载链接]https://www.cnblogs.com/codezpc/p/12696813.html1.问题如下:2.解决方案:进入tomcat安装目录下的conf目录下的logging.properties文件比如我的路径E:\apache-tomcat-9.0.30\conf\logging.properties修改这个句柄,将原来的UTF-8改成GBK即可1catalina.org.apache.juli.AsyncFileHandler.level = FINE1catalin_tomcat catakina log乱码

Prometheus 一文带你搞懂标签label的作用_prometheus label-程序员宅基地

文章浏览阅读2.2w次,点赞11次,收藏30次。- job_name: 'BJ Linux Server' basic_auth: username: prometheus password: 123456 static_configs: - targets: ['192.168.179.99:9100'] labels: idc: tongniu project: www - job_name: 'Shanghai Linux Server' ..._prometheus label

蓝桥杯之Python算法设计系列(二)_5、编写程序,求三位同学随机两两一组的所有组合。stu = ('a','b','c')-程序员宅基地

文章浏览阅读1.3w次,点赞64次,收藏248次。基础算法案例1.特殊回文数问题描述:左边往右边看,右边往左边看,都是同一个数叫做回文数,比如19291就是一个回文数,那么我们输入一个两位及以上的数字,返回回文数,案例如下:def is_pal(i_): i_s = str(i_) if i_s == i_s[::-1]: return True else: return Falsen=int(input("输入大于10的数:"))i = 10while i < n: _5、编写程序,求三位同学随机两两一组的所有组合。stu = ('a','b','c')

建立一个数组内放五个学生的数据(学号和成绩)。对象数组和对象指针_在主类中创建一个数组,数组中存放5位同学的信息,然后用循环结构遍历数组,输出所有-程序员宅基地

文章浏览阅读2.6k次。实现功能1:输出1,3,5的成员数据实现功能2:用指向对象的指针做函数参数,找出其中成绩最高者的学号并输出不过我想说的主要是主函数中的代码片段,关于指针如何调用类函数。int main(){ Student s[5]={Student("123",70.1),Student("456",60.2),Student("789",80.5),Student("987",90.6),Stude..._在主类中创建一个数组,数组中存放5位同学的信息,然后用循环结构遍历数组,输出所有

YOLOv8 Ultralytics:使用Ultralytics框架进行FastSAM图像分割_yolov8导向环境中ultralytics-程序员宅基地

文章浏览阅读1.4k次,点赞40次,收藏24次。Python、PyTorch、YOLOv8、Ultralytics、FastSAM、图像分割_yolov8导向环境中ultralytics

随便推点

P & R 11-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏61次。要做好floorplan需要掌握哪些知识跟技能?首先熟悉data flow对摆floorplan 有好处,对于减少chip的congestion 是有帮助的,但是也不是必需的,尤其是EDA工具快速发展的当今,比如Innovus 最新的MP特性,可以自动对cell和macro 一起做place,结果相当不错,省了很多事情。其次,需要了解 design的 power mesh,工艺的..._route_fix_sigoff_drc

Ubuntu14.04 Chrome无法打开的解决方法_ubuntu打不开chorme[35079:35079:0315/095950.320055:err-程序员宅基地

文章浏览阅读8.9k次,点赞2次,收藏2次。运行下以下命令 rm -rf ~/.config/google-chrome此时再打开就可以正常使用了_ubuntu打不开chorme[35079:35079:0315/095950.320055:error:gbm_wrapper.cc(76)]

苹果支付在哪里设置_微信刷脸支付怎么开通,在哪里设置?-程序员宅基地

文章浏览阅读698次。想要开通微信刷脸支付,有着两种不同的开通途径。微信刷脸支付怎么设置?下面让小马哥为您解答!(一)在微信APP上开通刷脸支付。在微信APP里打开“钱包”,点击右上角,选中并点击“支付管理”。在弹出的页面中点击“面容支付”即可开通刷脸支付。(如没有找到入口,请退出微信后重新登录进行刷新)(二)在专门的微信刷脸支付支付设备“青蛙”上开通。在“青蛙”上首次使用刷脸支付的时候,就可以开通刷脸支付。..._苹果13怎么设置刷脸支付

ICCV 2023 | R3D3:从多视图像实现动态场景的密集三维重建-程序员宅基地

文章浏览阅读513次。作者:Scentea | 来源:3D视觉工坊在公众号「3D视觉工坊」后台,回复「原论文」即可获取论文pdf。添加微信:dddvisiona,备注:三维重建,拉你入群。文末附行业细分群。R3D3是一种用于密集三维重建和自我运动估计的多摄像头算法,该方法通过迭代地结合多摄像头的几何估计和单目深度细化来实现一致的密集三维重建。R3D3的核心思想是将单目线索与来自多摄像头的空间-时间信息的几何深度估计相..._r3d3: dense 3d reconstruction of dynamic scenes from multiple cameras

@Autowired 和 @Resource的区别只知道注入方式不同?那可不行,其性能上也有差距!_resource autowire-程序员宅基地

文章浏览阅读2.4k次。代码的逻辑:这段代码来自Spring框架的AbstractBeanFactory类中的isFactoryBean方法。这个方法的主要作用是判断指定名称的bean是否是一个FactoryBean。工作原理:获取bean名称:首先,通过transformedBeanName(name)方法获取真正的bean名称。这个方法会去掉名称前面的&字符(如果有的话),因为在Spring中,&字符表示获取FactoryBean本身,而不是FactoryBean创建的对象。_resource autowire

第七届蓝桥杯_方格填数_简单搜索_再填格子 搜索-程序员宅基地

文章浏览阅读945次。填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)一共有多少种可能的填数方案?请填写表示方案数目的整数。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。我博客里面还有一个方格填数的,那是学长给我们的第一次测试的时候给我们出的题,跟这个一样的图,只是有所修改建议参考下(点这里!嘿嘿)_再填格子 搜索

推荐文章

热门文章

相关标签