2015年6月3日 星期三

UART(RX TX) RaspberryPI 與 Arduino 互傳字串

將Arduino與RasveryPi版上的RX與TX互接(PiRX=ArduiTX)
Pi版上請參考該技術手冊,Arduino則由程式碼內可得知



執行:ps ax | fgrep AMA

你會看到
2039 ? Ss+ 0:00 /sbin/getty -L ttyAMA0 115200 vt100
2055 pts/0 S+ 0:00 fgrep --color=auto AMA
確認無誤之後,繼續輸入以下指令:
sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt
將cmdline.txt備份
sudo vim /boot/cmdline.txt

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




修改完畢後,執行:
sudo vi /etc/inittab
請利用指令搜尋 /spawn 找到
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
改為:
#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
修改完畢後,執行
sudo reboot

重新啟動後,執行:
ps ax | fgrep AMA
確認出現以下訊息:
2069 pts/0 S+ 0:00 fgrep --color=auto AMA


Python程式碼:
import serial
import os

os.system("sudo chmod 666 /dev/ttyAMA0")
Uart = serial.Serial("/dev/ttyAMA0", baudrate = 38400, timeout = 1)
Uart.write("Pi UART is already.")
print("Pi UART is already.")

while True:
 UartSTR = Uart.readline()
 if len(UartSTR) > 2:
  print UartSTR,
  Uart.write(UartSTR)


Arduino程式碼:
#include <SoftwareSerial.h>
#include <Wire.h>
#define UartRX 2
#define UartTX 3
#define Led 13
byte serialA;
SoftwareSerial I2CBT(UartRX ,UartTX );
void CtrlLED(char str[128]);
/*================================================*/
void setup(){
 Serial.begin(9600);
 I2CBT.begin(38400);
 Serial.println("Welcom Uart CTRL");
 I2CBT.println("Welcom Uart CTRL");
 pinMode(Led, OUTPUT);
}
/*================================================*/
void loop(){
 ScanI2cStr();
 ScanSerialStr();
}
/*================================================*/
void ScanI2cStr(){
 if(I2CBT.available()) {
  int strnum=0;
  char str[128]="";
   memset( str, 0, strlen(str) );
  while (I2CBT.available() > 0){
   str[strnum++] = I2CBT.read();
   delay(3);
  }
  Serial.print("UartReturn:");
  Serial.println(str);
//  I2CBT.print("I2CGet:");
//  I2CBT.println(str);
 }
}

void ScanSerialStr(){
 if(Serial.available()) {
  int strnum=0;
  char str[128]="";
   memset( str, 0, strlen(str) );
  while (Serial.available() > 0){
   str[strnum++] = Serial.read();
   delay(3);
  }
  Serial.print("ScanSerialSend:");
  Serial.println(str);
//  I2CBT.print("ScanSerialSend:");
  I2CBT.println(str);
 }
}


執行後從Arduino端發送指令,Raspberry端會自動將收到的指令回傳。


參考資料:
Serial涵式庫說明
Pi版UART出現錯誤


附註:
Arduino指令上傳:

輸入指令時可用複製貼上一次打入多個字元
VIM編輯器增加顏色
在 .vimrc 中加入以下這行:
autocmd BufRead,BufNewFile *.ino set filetype=cpp

沒有留言:

張貼留言