注明出處:http://www.cnblogs.com/einstein-2014731/p/5551846.html
使用C語言控制樹莓派3B的串口,實現使用串口收發數據的目的。之前以為這個串口是被默認配制成serial控制樹莓派的模式,
其實安裝最新的NOOBS后是默認的serial0,而我們用的是ttyAMA0,還有的說這個和Pi3的板載藍牙沖突,兩者不能同時使用,
對此目前還沒試過兩者全開的情況。如果兩者不能同時使用豈不是很坑爹。
【1】 首先查看 /boot/overlays/ 目錄下有沒有 pi3-miniuart-bt-overlay.dtb 這個
文件,如果有,那么就是已經把硬件串口重新分配給了GPIO。
然后查看下 /boot/cmdline.txt這個文件,我的內容如下:
otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
|
可以看到console=serial0 用的是serial0 控制模式並非ttyAMA0。這里也不要改
【2】安裝wiringPi ,前面已經提到過,安裝之后查看GPIO的引腳分配。引腳圖如下:
【3】按照圖連線,TxD也就是8腳接在MAX232的RX上RxD接在TX上,將TTL電平轉成RS232電平使電腦可以識別。
【4】eclipse中編寫代碼
#include <wiringSerial.h> int main(void) { int fd; if((fd = serialOpen ("/dev/ttyAMA0",9600))<0) { printf("serial err\n"); } while(1) { UartBuff[0]=serialGetchar(fd); if(UartBuff[0]=='a') { serialPutchar(fd,UartBuff[0]); } sleep(0.5); } return EXIT_SUCCESS;
首先從串口接收數據,然后如果接收的是字符a,那么在把接收到的a發回去。
WiringPi關於串口函數如下,可以按照需求使用。
extern int serialOpen (const char *device, const int baud) ; extern void serialClose (const int fd) ; extern void serialFlush (const int fd) ; extern void serialPutchar (const int fd, const unsigned char c) ; extern void serialPuts (const int fd, const char *s) ; extern void serialPrintf (const int fd, const char *message, ...) ; extern int serialDataAvail (const int fd) ; extern int serialGetchar (const int fd) ;