樹莓派3B在Qt下使用串列埠傳送資料
阿新 • • 發佈:2019-02-13
一、解除串口占用
使用putty的時候神奇的發現樹莓派竟然是支援serial進行操作。試了試,和在ssh下使用沒有多少區別,速度也很快。
樹莓派的串列埠主要也就是被這個佔用了,配置釋放之後才能使用它來進行串列埠通訊。
在命令列裡輸入如下指令:
sudo raspi-config
在如下出現的介面中選擇 5
選擇“P6 Serial”,然後把它關閉了,即Disable。
開啟/boot/config.txt檔案,找到如下配置語句使能串列埠,如果沒有,可新增在檔案最後。
enable_uart=1
修改完成後可能無法直接使用,最好重啟下樹莓派。
二、建立Qt工程
開啟Qt Creator,選擇新建一個“非Qt專案”,然後選擇“純C++語言專案”,大致指示如下
這裡我的工程名字是“wiringPi”,選擇好儲存工程的路徑,接下來一路下一步。
wiring.pro裡的程式碼:
TEMPLATE=app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.cpp
# 下面這個LIBS很關鍵
LIBS += -lwiringPi
main.cpp裡的程式碼:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <iostream>
#include<sys/stat.h>
#include<unistd.h>
using namespace std;
int main(void)
{
int fd;
char str[6],str1[6];
if(wiringPiSetupSys()<0)return 1; //初始化wiringPi
sprintf (str,"%s%s%s\n","X","110","R");
sprintf(str1,"%s%s%s\n","Y","220","R");//字串拼接,%s可替換成int/float變數
while(1)
{
delay(10);
/*開啟串列埠裝置ttyS0,波特率9600*/
if((fd=serialOpen("/dev/ttyS0",9600))<0)
{
int time = millis();//計時函式,從wiringPi初始化開始至今
printf("serial doesn't open,return -1,time is %d",time);
return 1;
}
serialPrintf(fd,str); //向串列埠裝置傳送資料,整個str字串
serialPrintf(fd,str1);
serialClose(fd);//傳送完之後關閉串列埠,不然會出現程式執行一段時間後串列埠自動關閉的情況(serialOpen()返回-1)。
int c = waitKey(10);
if ((char)c == 27) { break; } // escape
}
serialClose(fd);
return 0;
}
三、測試結果
這裡有個小問題,使用wiringPi發著資料,程式執行一段時候串列埠自動關閉,程式直接返回結束。可能和wiringPi內部機制有關係吧。——最後發現只要不去動那個彈出來Terminal介面,串列埠就不會中斷,真是神奇。