树莓派UDP通信及串口通信

                         树莓派UDP通信及串口通信

          
       该程序运行在树莓派上,主要功能是把收到的UDP消息通过树莓派自带串口发给下位机,同时把串口收到的数据通过UDP发送出去,使用threading模块启动两个线程,互不干涉,可以在此基础上更改实现各种功能。
       我写这个是用于四轴飞行器控制的,树莓派和stm32搭在飞行器上,地面用手机控制,可以实现飞行器姿态及参数实时监测控制,同时树莓派接摄像头,传航拍图像给地面手机。下面的程序只是通信部分的,关于摄像头视频流的捕获及上传程序和手机端的程序工程较大,等忙过这一段时间会上传的。

           首先,树莓派在使用串口之前是需要配置一些文件的。

         1.修改
cmdline.txt
                 >>> sudo vi /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. 修改
    inittab
      >>> sudo vi /etc/inittab
      将下面这一行加#注释掉,一般是最后一行
     #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

    3.安装python-serial
     >>>sudo apt-get install python-serial

    现在就可以用了,下面贴上源代码:
    
#!/bin/env/python
import serial
import string
import time
import threading
import socket
host=''
port=10001
global addr  #UDP 客户端的IP地址,必须设为全局变量,才能在线程间共享
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
s.bind((host,port))
ser = serial.Serial('/dev/ttyAMA0',9600,timeout =0.1) #串口设置
if ser.isOpen() == False:
        ser.open()
class timer(threading.Thread): # timer class 
        def __init__(self, num, interval):
                threading.Thread.__init__(self)
                self.thread_num = num
                self.interval = interval
                self.thread_stop = False

        def run(self):
                global addr
                while 1:
                        if self.thread_num == 1:
                                try:
                                        data,addr=s.recvfrom(1024) #接收到的UDP消息
                                        print"got data from",addr
                                        ser.write(data)  #将UDP内容通过串口发送至下位机
                                except  KeyboardInterrupt:
                                        raise
                        if self.thread_num == 2:
                                try:
                                        re = ser.readlines() #收到的串口数据
                                        print re
                                        c=''.join(re)  
            #sendto()第一个参数是str,而readlins()返回值类型是list,故需要先将list转换为str再发送,之前              数据不断丢包,一直不明白是这个原因。
                                        s.sendto(c,addr)  #将串口数据通过UDP发送出去
                                except:
                                        pass

                      # time.sleep(self.interval) 
def test():
        thread1 = timer(1, 0.1) #UDP recev and serial send
        thread2 = timer(2, 0.1) #serial recev and UDP send
        thread1.start()
        thread2.start()
        return

if __name__ == '__main__':
        test()

       直接在终端里输入python 文件名.py 即可运 行
       附上源程序下载链接 点击打开链接

你可能感兴趣的:(linux,python,UDP,树莓派,串口通信)