文章目录
- `Arduino`的串口函数
- 接收函数`Serial.read()`
- 检测串口`Serial.available()`
- 串口通信例程
-
所有要进行串口通信的设备,
GND
必须相连
(共地)
——>因为我们进行串口通信的设备是一个具有高电平和低电平的电压信号,所以进行通讯的设备必须接地,这样才有相应的高电平和低电平产生
注意:Arduino的TX0
和RX1
引脚如果外接了别的设备,那么在我们上传代码到Arduino时是一定会失败的(上传时用到了这两个引脚),所以我们上传时要要先把导线移除掉
在发送数据时,为了避免打断Arduino正在进行的工作,聪明的Arduino工程师选择把串口输入的数据放入Arduino的串行数据缓冲区中,等到Arduino完成工作后,就可以检测串行数据缓冲区中是否有数据,进而处理串口数据
Arduino
的串口函数
Serial.begin();
Serial.end();
Serial.available();
Serial.read();
Serial.peek();
Serial.flush();
Serial.print();
Serial.println();
Serial.write();
Serial.SerialEvent();
Serial.readBytes(buffer,length);
Serial.println(incomingByte, DEC);
关于Arduino
的串口函数详解:
Arduino - 串口操作函数与示例代码大全(转载)
Arduino - 串口操作函数与示例代码大全
接收函数Serial.read()
如果串行数据缓冲区有数据,这个函数会读取串行数据缓冲区的第一个字节,数据读取位置移动到下一个数据缓冲区,也就是说如果继续读取的话会读取下一个数据缓冲区的第一个字节.
如果数据缓冲区没有数据,将返回-1
检测串口Serial.available()
当串行数据缓冲区中有数据时,函数Serial.available()
的返回值为非0,我们可以以此为判断条件,来处理串口数据!
if(softSerial.available())
{
......
}
串口通信例程
OpenMV寻找视野中最大的色块,并把色块的中心坐标发送给Arduino
该例程用到了软件串口
OpenMV
代码
import sensor, image, time
import json
from pyb import UART
yellow_threshold = (55, 98, -128, 127, 23, 127)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(10)
sensor.set_auto_whitebal(False)
clock = time.clock()
uart = UART(3, 115200)
def find_max(blobs):
max_size=0
for blob in blobs:
if blob.pixels() > max_size:
max_blob=blob
max_size = blob.pixels()
return max_blob
while(True):
clock.tick()
img = sensor.snapshot()
blobs = img.find_blobs([yellow_threshold])
if blobs:
print('视野中的色块数sum : %d'% len(blobs))
data=[]
max_blob=find_max(blobs)
img.draw_rectangle(max_blob.rect())
img.draw_cross(max_blob.cx(), max_blob.cy())
data.append( (max_blob.cx(),max_blob.cy()) )
data_out = json.dumps(set(data))
uart.write(data_out +'\n')
print('you send:',data_out)
else:
print("not found!")
Arduino
代码
#include <SoftwareSerial.h>
SoftwareSerial softSerial(10, 11);
typedef struct
{
int data[50][2] = {{0,0}};
int len = 0;
}List;
List list;
void setup()
{
softSerial.begin(115200);
Serial.begin(115200);
}
void loop()
{
if(softSerial.available())
{
getList();
for (int i=0; i<list.len; i++)
{
Serial.print(list.data[i][0]);
Serial.print('\t');
Serial.println(list.data[i][1]);
}
Serial.println("============");
clearList();
}
}
String detectString()
{
while(softSerial.read() != '{');
return(softSerial.readStringUntil('}'));
}
void clearList()
{
memset(list.data, sizeof(list.data),0);
list.len = 0;
}
void getList()
{
String s = detectString();
String numStr = "";
for(int i = 0; i<s.length(); i++)
{
if(s[i]=='(')
{
numStr = "";
}
else if(s[i] == ',')
{
list.data[list.len][0] = numStr.toInt();
numStr = "";
}
else if(s[i]==')')
{
list.data[list.len][1] = numStr.toInt();
numStr = "";
list.len++;
}
else
{
numStr += s[i];
}
}
}
注意:对于不同的数据,我们只需要更改String detectString()
和void getList()
中的判断条件即可
结果:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)