当前位置: 澳门新濠3559 > 操作系统 > 正文

树莓派的串口默认为串口终端调试使用,需要先

时间:2019-10-07 14:52来源:操作系统
1. python 工具 OS: ubuntu 16.04 树莓派的串口默认为串口终端调试使用,如要正常使用串口则需要修改树莓派设置。关闭串口终端调试功能后则不能再通过串口登陆访问树莓派,需从新开启后

1.  python 工具

OS: ubuntu 16.04

树莓派的串口默认为串口终端调试使用,如要正常使用串口则需要修改树莓派设置。关闭串口终端调试功能后则不能再通过串口登陆访问树莓派,需从新开启后才能通过串口控制树莓派。

转:

#coding = utf-8

import pty
import os
import select

def mkpty():
    master1, slave = pty.openpty()
    slaveName1 = os.ttyname(slave)
    master2, slave = pty.openpty()
    slaveName2 = os.ttyname(slave)
    print 'nslave device names: ', slaveName1, slaveName2
    return master1, master2

if __name__ == "__main__":
    master1, master2 = mkpty()
    while True:
        rl, wl, el = select.select([master1, master2], [], [], 1)
        for master in rl:
            data = os.read(master, 128)
            print "read %d data." %len(data)
            if master == master1:
                os.write(master2, data)
            else:
                os.write(master1, data)

ROS:kinetic

一、设置串口

 

使用方法:

1.安装arduino  sudo apt-get install arduino

要使用这个串口,必须先进行设置:

树莓派是否能够使用串口呢,答案是肯定的 ,以下是具体方法

 

1.树莓派的第一排的第三,四,五个分别,也就是下图的6,8,10三个端口分别是地,TX与RX,与被连接设备连接起来。注意树莓派的TX要连接从设备的RX,树莓派的RX要连接树莓派的TX澳门新濠3559 1

 

2.树莓派上只有一个串口,系统默认将它作为调试口,所以不能直接当成普通串口进行编程和使用,需要先将调试口的配置去掉,再使用。此处需要修改两处文件

  2.1  修改      在终端输入如下指令 

[plain] view plaincopyprint?澳门新濠3559 2澳门新濠3559 3

  1. sudo nano /boot/cmdline.txt  

    sudo nano /boot/cmdline.txt

      打开后将红色部分删除

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

      删除后,变成如下结果保存退出

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

 

 2.2  修改 /etc/inittab

   在终端输入如下指令 

[plain] view plaincopyprint?澳门新濠3559 4澳门新濠3559 5

  1. sudo nano /etc/inittab  

    sudo nano /etc/inittab

  打开后将最后一行注释掉 在前面加上一个#号即可

 #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

 

 

3.修改完毕后,需要在树莓派上安装一个minicom,这里的minicom是Linux平台的串口调试工具,相当于Windows上的串口调试助手

   3.1  安装minicom,输入以下命令

 

[plain] view plaincopyprint?澳门新濠3559 6澳门新濠3559 7

  1. sudo apt-get install minicom  

    sudo apt-get install minicom

 

   

  3.2  安装完毕后需要对minicom进行配置,此处配置文件需要root权限,不然无法保存配置的参数,那么在命令行中输入如下命令

 

[plain] view plaincopyprint?澳门新濠3559 8澳门新濠3559 9

  1. sudo passwd root  

    sudo passwd root

   执行此命令后系统会提示输入两遍的root密码,输入你想设的密码即可,然后在执行

 

 

[plain] view plaincopyprint?澳门新濠3559 10澳门新濠3559 11

  1. sudo passwd --unlock root  

    sudo passwd --unlock root

   这样就解锁了root账户

 

 

  3.3  切换到root账户,再次打开命令行,输入minicom参数配置命令

 

[plain] view plaincopyprint?澳门新濠3559 12澳门新濠3559 13

  1. minicom -s  

    minicom -s

树莓派的串口默认为串口终端调试使用,需要先将调试口的配置去掉。    在主菜单的第三项Serial Port Setup,进入下一级菜单,根据菜单项的提示字母选择,按A将串口设备修改为  /dev/ttyAMA0

 

   ,按E将波特率修改为9600或者自己需要的数值,设置好以后返回主菜单,选择Save Setup as Dfl 

    然后选择Exit,此时如果正常的话就可以进行串口收发了,这里我的树莓派是连接到一台PC上去的,我利用PC的串口调试软件成功进行了收发

 

   tips: 按CTRL A,接着按Z可以查看minicom的帮助

  启动:在终端里运行“python mkptych.py&”,这样就可以生成一个基于pty(伪终端)的虚拟端口对,两个设备名会显示在终端里。然后就可以利用这两个设备名在本机上进行虚拟串口之类的调试。

2.安装ros包  sudo apt-get install ros-kinetic-rosserial-arduino

1.执行如下命令进入树莓派配置

  关闭:使用完后用ps查看这个python进程的pid号,然后kill掉即可。

sudo apt-get install ros-kinetic-rosserial

sudo raspi-config

澳门新濠3559 14

3.设置arduino的SketchBook,将ros_lib弄进去,关于SketchBook的文件目录,在File->Preferences

选择Advanced Options->Serial ->no关闭串口调试功能

 

澳门新濠3559 15

2.修改/boot/cmdline.txt

2.  Ubuntu下 cutecom 图像界面串口调试工具(参考:

也可以自己定义该目录.

输入下面指令:

  (1)终端下载命令:sudo apt-get install cutecom 

cd <sketchbook>/libraries 如果没有libraries目录,自己创建这个目录就可以啦,如果里面已经包含ros_lib目录,请使用rm -rf ros_lib ,防止发生冲突.

rosrun rosserial_arduino make_libraries.py .   用来生成ros_lib库,(注意使用.,当前目录)

sudo nano /boot/cmdline.txt

  (2)通过终端打开软件:sudo cutecom (需要root权限,否则无法打开串口)

澳门新濠3559 16

删除划线斜体部分:

  (3)在 Device 中填写上边生成的虚拟串口号  /dev/pts/24   和   /dev/pts/25,  Input  中输入文字 ,点击回车发送测试

 

dwc_otg.lpm_enable=0console=ttyAMA0,115200 kgdboc=ttyAMA0,115200console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

澳门新濠3559 17

 由于ubuntu下截图不怎么好用,就用了官网的图,道理是一样的。可以依据这些demo来制作ardunio下的节点,和服务。

最终变为

 

关于arduino IDE的串口链接,在 Tools->Serial Port下,选材/dev/ttyACM×(× 可能是0,1,2,3...)

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

3.  python 编写测试程序

关于brltty和Arduino之间冲突,但在unbuntu 16.04下没什么影响,在Tools->Serial Port 依然可以看到/dev/ttyACM*,并且成功烧入。

3.修改/etc/inittab

  (参考   ,

并不是一定要卸载brltty,这个我觉得要实际试过才可以这么说.

输入下面指令:

  (1)1.安装pyserial(安装 serial module)

rosrun rosserial_python serial_node.py /dev/ttyACM* 用来启动rosserial节点。

跑的时候,如果arduino 串口监听,rosserial一起启动,经常导致串口异常,导致串口插拔,才可以重新使用。
这个问题,比较不好理解,linux串口非独占的。目前还在解决中。

由于linux串口的跳动,必须固定串口。

sudo nano /etc/inittab

     这里区分python2和 python3:

澳门新濠3559 18

注释掉最后一行内容:

    

 

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

1 sudo apt install python-pip //python2
2 sudo apt install python3-pip    //python3
lsusb 可以查看当前的usb口。

当然也可以用dmesg

OK、重启下raspberry pi现在就可以自己编写程序测试串口了。我是把TXD与RXD短接,实现自发自收的。

  (2)然后通过:

澳门新濠3559 19

二、使用minicom调试串口

1 pip install pyserial    //python2
2 pip3 install pyserial   //python3

可以查看具体的设备。我觉得用arduino 的serial port看起来更合理点。

设置完之后串口便可以正常使用了,便可测试一下树莓派的UART是否正常工作,Pioneer600扩展板带有USB转UART功能,用USB线连接到电脑。minicom便是一个简单好用的工具。minicom是linux平台串口调试工具,相当于windows上的串口调试助手。

  (3)测试程序

如果当前arduino的串口好是/dev/ttyACM0,

1、minicom安装

 1 import serial
 2 from time import sleep
 3 
 4 def recv(serial):
 5     while True:
 6         data = serial.read_all()
 7         if data == '':
 8             continue
 9         else:
10             break
11         sleep(0.02)
12     return data
13 
14 if __name__ == '__main__':
15     serial = serial.Serial('COM5', 9600, timeout=0.5)  #/dev/ttyUSB0
16     if serial.isOpen() :
17         print("open success")
18     else :
19         print("open failed")
20 
21     while True:
22         data =recv(serial)
23         if data != b'' :
24             print("receive : ",data)
25             serial.write(data) #数据写回

使用udevadm info /dev/ttyACM0 查看串口的具体信息。

sudo apt-get install minicom

 

澳门新濠3559 20

2、minicom启动

  

这中方式查看我觉得不是很好,就使用lsusb -vv

minicom -D /dev/ttyAMA0

  

可以看得更清楚

默认波特率为115200,如需设置波特率为9600加参数 -b 9600,-D代表端口,/dev/ttyAMA0类似于windows中的COM1,

 

澳门新濠3559 21

同时在windows也打开串口助手。设置波特率为115200,选择对应的串口号

参考文章:  

可以清楚的看到 idVendor 和idpProduct,这两个是自定义串口的重要参数。

3、串口数据传输

       

 

直接在minicom控制台中输入内容即可通过串口发送数据,在windows串口助手中会接到到输入的内容。同理,在windows串口助手中发送数据会在minicom控制台上显示。如果minicom打开了回显(先Ctrl A,再E)可在控制台中观察到输出内容,如果回显关闭minicom控制台不会显示你输入的内容。先Ctrl A,再Q,退出minicom。

       

根据这些信息重写串口设备命名规则,采用Linux的udev来自定义规则来管理设备名称

三、串口编程

 

(1)

1、wiringPi

注:解决 ImportError: No module named 'serial' 问题

  

具体步骤如下。

编译并执行,在window下打开串口助手会接收到” Hello World!!!”,发送数据会返回到显示窗口。

/etc/udev/rules.d/10-local.rules

gcc –Wall uart.c –o uart –lwiringPi

修改这个文件,我发现不存在这个文件(ubuntu 16.04),那么我 touch 10-local.rules (其实这个文件名可以随便定义,但是毕竟不是太了解,所以按照Q&A来做,防止无法复现)

sudo ./uart

接着 根据查询的idVendor 和idpProduct

#include<stdio.h>

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK ="MyAruduino"添加到10-local.rules文件中
`udevadm info -a -p $(udevadm info -q path -n /dev/ttyACM0) `

#include<wriingpi.h>

然后重启电脑。

#include<fcntl.h>

澳门新濠3559 22

int main()

但发现Arduino IDE中显示的还是/dev/ttyACM0,所以我觉得直接使用cutecom串口调试工具来使用.

{

cutecom -> sudo apt-get install cutecom(安装)

int fd;

澳门新濠3559 23

if(wiringPiSetup() < 0)return 1;

Device:直接写/dev/MyArduino ,下拉是无法选择的,

if((fd = serialOpen("/dev/ttyAMA0",115200)) < 0)return 1;

我在Arduino中写serial.write("ggg"); 在cutecom中已经显示数据,说明可用。

printf("serial test start ...");

有一点要说明,当你直连Arduino的烧入线的时候,/dev/ttyACM0,当你用扩展板的是/dev/ttyUSB*.(这个是有区别的)。

serialPrintf(fd,"Hello World!!!");

 

while(1)

至于ROSSerial其他的问题,必须在长期使用中慢慢积累。

{

 

serialPutchar(fd,serialGetchar(fd));

(2接下来详细的使用ROSSerial

}

开启 一个console  : roscore

serialClose(fd);

再重新开起一个console

return 0;

 澳门新濠3559 24

}

再开起一个console :

二、python

rostopic pub [topic] [msg_type] [args]

首先运行如下命令安装python serial扩展库。

澳门新濠3559 25

sudo apt-get install python-serial

当跑一段时间,Serial_node就会报错(无法同步),关于这个问题,

编写程序

我觉的是我开启来Ardunio IDE 的Serial Monitor.所以我关闭Ardunio IDE的Serial Monitor,发现没有出现这个错误。(大概测试来半个小时)

#!/usr/bin/python

虽然说linux 串口是非独占的,但同时使用可能会导致无法同步的问题,这样的话对于调试感觉很麻烦。

# -*- coding:utf-8 -*-

所以在Arduino 中加来发布代码,在rostopic中看是否接受正确,以下是Arduino代码:

import serial

#include <ros.h>
#include <std_msgs/String.h>

ser = serial.Serial("/dev/ttyAMA0",115200)

澳门新濠3559,ros::NodeHandle  nh;
std_msgs::String str_msg;
ros::Publisher ServoPub("ServoPub", &str_msg);
void servo_cb( const std_msgs::String &cmd_msg)
{
  str_msg =cmd_msg;
  ServoPub.publish(&str_msg);
  nh.spinOnce();
  delay(1);
}

print('serial test start ...')

ros::Subscriber<std_msgs::String> sub("ServoControl", servo_cb);

ser.write("Hello Wrold !!!n")

void setup()
{

try:

  nh.initNode();
  nh.advertise(ServoPub);
  nh.subscribe(sub);
}

while True:

void loop()
{
  nh.spinOnce();
  delay(1);

ser.write(ser.read())

}

except KeyboardInterrupt:

接着启动 :  rosrun rosserial_python serial_node.py /dev/MyArduino

if ser != None:

接着: rostopic echo ServoPub
接着发布消息:rostopic pub ServoControl std_msgs/String 'gg'

ser.close()

下图是接受到的数据:

执行程序,实验结果和上面一样。

澳门新濠3559 26

sudo python uart.py

接受到publish 的String消息.

注:(1)ser = serial.Serial("/dev/ttyAMA0",115200) 打开串口,波特率为115200

 以上就是rosserial的一些基本使用,如果有新的内容继续更新。

(2)ser.write(ser.read())接收字符并回传

 

(3) ser.close() 关闭串口

 

总结:通过上面两个程序我们可以发现和i2c一样,wiringPi,python程序都是读写串口设备文件/dev/ttyAMA0操作串口,故我们也可以通过sysfs的形式编程操作串口,在这里我就不详细介绍了。

 

 

 

 

 

 

 

 

 

 

 

编辑:操作系统 本文来源:树莓派的串口默认为串口终端调试使用,需要先

关键词: 澳门新濠3559