您的位置:时时app平台注册网站 > 时时app平台注册网站 > 树莓派串口通信时时app平台注册网站

树莓派串口通信时时app平台注册网站

2019-10-12 10:52

     这里区分python2和 python3:

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

sudo apt-get install minicom

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

  

再重新开起一个console

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

参考文章:  

1.安装arduino  sudo apt-get install arduino

sudo raspi-config

 

具体步骤如下。

#!/usr/bin/python

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

也可以自己定义该目录.

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

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

OS: ubuntu 16.04

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

       

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

sudo ./uart

1.  python 工具

(2接下来详细的使用ROSSerial

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

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

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

输入下面指令:

  (2)然后通过:

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

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

    

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

if ser != None:

时时app平台注册网站 1

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

}

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

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

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

 

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

注释掉最后一行内容:

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

再开起一个console :

gcc –Wall uart.c –o uart –lwiringPi

 

然后重启电脑。

输入下面指令:

  (参考   ,

 

{

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

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

ser.write(ser.read())

       

 

最终变为

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

}

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

 

时时app平台注册网站 2

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

时时app平台注册网站 3

时时app平台注册网站 4

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

1 sudo apt install python-pip //python2
2 sudo apt install python3-pip    //python3

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

3.修改/etc/inittab

 

时时app平台注册网站 5

3、串口数据传输

  

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>

使用方法:

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

sudo nano /boot/cmdline.txt

 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) #数据写回

 

if(wiringPiSetup() < 0)return 1;

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

开启 一个console  : roscore

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

#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)

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

import serial

  

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

int main()

3.  python 编写测试程序

rostopic pub [topic] [msg_type] [args]

ser.close()

  (3)测试程序

ROS:kinetic

删除划线斜体部分:

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

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

接受到publish 的String消息.

2.修改/boot/cmdline.txt

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

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

 

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

 

#include<stdio.h>

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

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

时时app平台注册网站 6

二、使用minicom调试串口

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

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

sudo apt-get install ros-kinetic-rosserial

return 0;

时时app平台注册网站 7

while(1)

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

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

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

sudo nano /etc/inittab

接着 根据查询的idVendor 和idpProduct

三、串口编程

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

1、minicom安装

可以看得更清楚

except KeyboardInterrupt:

 

sudo python uart.py

 

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

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);
}

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

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

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

 

二、python

 

#include<fcntl.h>

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

一、设置串口

 时时app平台注册网站 8

int fd;

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

sudo apt-get install python-serial

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

serialPutchar(fd,serialGetchar(fd));

时时app平台注册网站 9

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

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

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

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

while True:

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

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

时时app平台注册网站 10

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

void setup()
{

try:

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

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

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

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

serialClose(fd);

lsusb 可以查看当前的usb口。

当然也可以用dmesg

2、minicom启动

树莓派串口通信时时app平台注册网站。可以清楚的看到 idVendor 和idpProduct,这两个是自定义串口的重要参数。

print('serial test start ...')

时时app平台注册网站 11

编写程序

 

minicom -D /dev/ttyAMA0

(1)

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

 

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

 

{

 

1、wiringPi

 

}

 

 

 

下图是接受到的数据:

时时app平台注册网站 12

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

 

时时app平台注册网站 13

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

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

树莓派串口通信时时app平台注册网站。  nh.initNode();
树莓派串口通信时时app平台注册网站。  nh.advertise(ServoPub);
  nh.subscribe(sub);
}

本文由时时app平台注册网站发布于时时app平台注册网站,转载请注明出处:树莓派串口通信时时app平台注册网站

关键词: