- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Jetson TX2 和 Arduino Uno 尝试通过 USB 串口进行通信,前提是我正在使用 Arduino 与一些激光 ToF 传感器和热电堆进行通信。
Jetson 正在运行 Ubuntu 16.04 以实现 ros 兼容性,因为这最终将绑定(bind)到 ros 节点
仅使用 Arduino IDE,对其进行串行监控,调用和响应按预期工作,但是一旦我尝试使用 Jetson 使调用和响应正常工作,这就是数据未正确写入终端的地方。
当 arduino 准备好接收时,它会向 Jetson 打印一个字节“9”,而当 Jetson 想要分别接收飞行时间或热传感器数据时,它会通过串行打印“1”或“2”。
Jetson 的预期通信是从 ToF 传感器接收 5 个逗号分隔的浮点值,然后是来自热传感器的 64 个逗号分隔的浮点值,但是我得到以下信息:
Sending 1 for ToF Data
Reading data
1 bytes read, buffer contains:
Sending 2 for Thermal Data
Reading data
35 bytes read, buffer contains: Thermal/ToF sensor data
Arduino 的代码如下:
#include <Wire.h>
#include <VL53L1X.h>
#include <Adafruit_AMG88xx.h>
#define SensorNum 5 // Change number if you have less sensors, just be aware that the digital pins count down, so you may need to move the starting pin number up from pin 6
#define DEBUG 0 // Change to one if you want additional debugging information printed to the serial out.
#define SFX 0 // Set to 0 if you don't want to hear the set-up pips when the ToF sensors are being configured
#define Wait_For_Read 1 // Determines if the Arduino waits for a bit to be sent by Jetson before sending sensor data
VL53L1X sensors[SensorNum];
Adafruit_AMG88xx amg;
float pixels[AMG88xx_PIXEL_ARRAY_SIZE]; // Pixel array size is 64, as it is an 8x8 thermopile array
int M_pixels[8][8];
/* Change these values below to alter what the bands the temperature is classified as
* these values are output into a 8x8 array with numbers of 0 to 5, with temperatures below the lower threshold being 0
* this is done because its a lot easier to read at a glance a small array of numbers and it's easy to visualise where the heat is compared to the 8x8 of floating numbers
* the values are in degrees celsius
*/
float LowerThresh = 25.0;
float LowerMidThresh = 27.5;
float MidThresh = 30.0;
float UpperMidThresh = 32.5;
float UpperThresh = 35.0;
int speakerpin = 10; // digital pin for the piezo to output small pips for user convinience, if SFX is diabled this pin is not used and can be reassigned.
void setup() {
Serial.begin (115200);
if (SFX){
pinMode(speakerpin, OUTPUT);
PlayTone(5, 2, 250); // Plays a small pip to let user know arduino is running, plays 5 rapid pips
}
Wire.begin();
delay(500);
Serial.println("Setting up sensors");
Serial.println("Beginning VL53L1X ToF sensor set-up");
ToF_Setup();
Serial.println("Beginning AMG8833 Thermal sensor set-up");
Thermal_Setup();
Serial.println("Sensors initialised");
Serial.println ("Scanning I2C addresses"); // Outputs address to serial, addressess 0x28, 0x2A, 0x2C, 0x2E, 0x30, and 0x69 should be seen
int count = 0;
for (int i = 1; i < 120; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0)
{
Serial.print ("Found address: ");
Serial.print (i, DEC);
Serial.print (" (0x");
Serial.print (i, HEX);
Serial.println (")");
count++;
delay (1);
}
}
Serial.print ("Found ");
Serial.print (count, DEC);
Serial.println (" device(s).");
byte rdy = 9;
Serial.println(rdy);
}
void loop() {
// put your main code here, to run repeatedly:
byte output = 0;
if (Wait_For_Read){
if (Serial.available()){
output = Serial.read();
}
}
else output = 49;
// Serial.println(output);
if(output == 49){
ToF_Read();
}
if(output == 50){
Thermal_Read();
}
if (DEBUG) {
ToF_Read_Debug();
Thermal_Read_Debug();
delay(1000); // delay to allow reading in arduino serial monitor
}
Serial.flush();
delay(100);
}
void ToF_Setup(){
int address = 0x28; // first address that the first sensor will be set to
for (int i = 6; i > 1; i--){ // sets up pins 6 to 2, for the XSHUT pin on VL53L1X to allow for address change
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
delay(100);
}
Wire.begin();
for (int j = 0; j < SensorNum; j++){
if (DEBUG){
Serial.print("Pin: ");
Serial.println(6 - j);
Serial.print("Current address: ");
Serial.println(address, HEX);
}
if (SFX) PlayTone(j+1, 6, 500); // plays pips according to which sensor is being set-up, 1 pip for sensor 1, 2 pips for sensor 2, etc..
pinMode(6 - j, INPUT);
delay(150);
sensors[j].init(true);
delay(100);
sensors[j].setAddress(address);
Serial.print("Sensor: ");
Serial.print(j+1);
Serial.println(" address set.");
address += 2;
delay(200);
sensors[j].setDistanceMode(VL53L1X::Long);
sensors[j].setMeasurementTimingBudget(50000);
sensors[j].startContinuous(50);
sensors[j].setTimeout(100);
}
delay(150);
Serial.println("ToF's initialised");
}
void Thermal_Setup(){
Serial.println(F("AMG88xx pixels"));
Serial.println(AMG88xx_PIXEL_ARRAY_SIZE);
bool status;
// default settings
status = amg.begin();
if (!status) {
Serial.println("Could not find a valid AMG88xx sensor, check wiring!");
while (1);
}
Serial.println("Thermal sensor initialised");
Serial.println();
delay(100); // let sensor boot up
}
void ToF_Read(){
for (int i = 0; i < SensorNum; i++){
if(i == (SensorNum-1)){
Serial.println(sensors[i].read()/1000.0, 4); // converts mm reading to meter, 4 signicant figures
}
else{
Serial.print(sensors[i].read()/1000.0, 4); // converts mm reading to meter, 4 signicant figures
Serial.print(",");
}
if (sensors[i].timeoutOccurred()) {
Serial.print("8000");
Serial.print(",");
}
}
}
void Thermal_Read(){
amg.readPixels(pixels);
for (int i = 1; i <= AMG88xx_PIXEL_ARRAY_SIZE; i++) {
if(i == (AMG88xx_PIXEL_ARRAY_SIZE)){
Serial.println(pixels[i - 1]);
}
else{
Serial.print(pixels[i - 1]);
}
if (i < AMG88xx_PIXEL_ARRAY_SIZE) Serial.print(",");
}
}
void PlayTone(int repetition, int duration, int hold){
for (int j = 0; j < repetition; j++){
for (long i = 0; i < duration * 1000 ; i += 600){
digitalWrite(speakerpin, HIGH);
delayMicroseconds(1915);
digitalWrite(speakerpin, LOW);
delayMicroseconds(1915);
}
delay(hold);
}
}
void check_pixels() {
int row;
int col;
int val;
// clear all previous pixels for next refresh
for (int j = 0; j < 8; j++) {
for (int h = 0; h < 8; h++) {
M_pixels[j][h] = 0;
}
}
// if a pixel is above the temp threshold set to high
for (int i = 0; i < AMG88xx_PIXEL_ARRAY_SIZE; i++) {
row = round(i / 8);
if (i % 8 == 0) {
col = 0;
}
else
{
col = i % 8;
}
if (DEBUG) {
// Serial.print(row);
// Serial.print(',');
// Serial.println(col);
}
if (pixels[i] >= UpperThresh) {
val = 5;
}
else if (pixels[i] >= UpperMidThresh) {
val = 4;
}
else if (pixels[i] >= MidThresh) {
val = 3;
}
else if (pixels[i] >= LowerMidThresh) {
val = 2;
}
else if (pixels[i] >= LowerThresh) {
val = 1;
}
else {
val = 0;
}
if (DEBUG) {
Serial.print(i);
Serial.print(',');
Serial.print(pixels[i]);
Serial.print(',');
Serial.println(val);
}
M_pixels[row][col] = val;
}
if (DEBUG) { pixels_debug();}
//This will print out all the pixels that should be turned on to
//movesensor();
}
void pixels_debug() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
Serial.print(M_pixels[i][j]);
Serial.print(',');
}
Serial.println(' ');
}
}
void ToF_Read_Debug(){
for (int i = 0; i < SensorNum; i++){
Serial.print("Sensor ");
Serial.print(i+1);
Serial.print(": ");
Serial.print(sensors[i].read());
if (sensors[i].timeoutOccurred()) { Serial.print(" TIMEOUT"); }
Serial.println();
}
}
void Thermal_Read_Debug(){
amg.readPixels(pixels);
Serial.print("[");
for (int i = 1; i <= AMG88xx_PIXEL_ARRAY_SIZE; i++) {
Serial.print(pixels[i - 1]);
Serial.print(", ");
if ( i % 8 == 0 ) Serial.println();
}
Serial.println("]");
Serial.println();
if (DEBUG) check_pixels();
}
Jetson 的代码是:
H文件:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <stdbool.h>
#define BUFFER_SIZE 1024
#define DEBUG 1
// Adapted from Canonical Arduino read by Chris Heydrick -
// https://github.com/cheydrick/Canonical-Arduino-Read/blob/master/canonicalarduinoread.c
int init();
bool get_tof(int fd);
bool get_thermal(int fd);
bool read_data(int fd);
bool chk_rdy(int fd);
C++ 文件:
#include "SensorSuite.h"
int main(int argc, char *argv[]){
int fd;
bool rdy = 0;
fd = init();
while (!rdy) {
rdy = chk_rdy(fd);
}
rdy = get_tof(fd);
while (!rdy) {
rdy = read_data(fd);
}
rdy = get_thermal(fd);
while (!rdy) {
rdy = read_data(fd);
}
close(fd);
}
int init(){
int fd;
struct termios toptions;
/* open serial port */
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY);
printf("fd opened as %i\n", fd);
/* wait for the Arduino to reboot */
usleep(3500000);
/* get current serial port settings */
tcgetattr(fd, &toptions);
/* set 9600 baud both ways */
cfsetispeed(&toptions, B115200);
cfsetospeed(&toptions, B115200);
/* 8 bits, no parity, no stop bits */
toptions.c_cflag &= ~PARENB;
toptions.c_cflag &= ~CSTOPB;
toptions.c_cflag &= ~CSIZE;
toptions.c_cflag |= CS8;
/* Canonical mode */
toptions.c_lflag |= ICANON;
/* commit the serial port settings */
tcsetattr(fd, TCSANOW, &toptions);
return fd;
}
bool get_tof(int fd){
if(DEBUG) printf("\nSending 1 for ToF Data\n");
write(fd, "1", 1);
tcdrain(fd);
usleep(2000000);
return 0;
}
bool get_thermal(int fd){
if(DEBUG) printf("\nSending 2 for Thermal Data\n");
write(fd, "2", 1);
tcdrain(fd);
usleep(2000000);
return 0;
}
bool read_data(int fd){
int n;
char buf[BUFFER_SIZE] = "temp text";
if(DEBUG) printf("\nReading data\n");
n = read(fd, buf, BUFFER_SIZE);
buf[n] = 0;
// if(n!=1)
if (n < 35) return 0;
else {
if (DEBUG) printf("%i bytes read, buffer contains: %s\n", n, buf);
return 1;
}
}
bool chk_rdy(int fd){
int n;
char buf[BUFFER_SIZE] = "temp text";
n = read(fd, buf, BUFFER_SIZE);
buf[n] = 0;
if ((buf[0] == '9') && (n == 2)) return 1;
else return 0;
}
我已经设法通过添加 if 语句(修改了 C++ 代码)来解决 Jetson 上的空返回消息,以便在返回预期的字节数之前不打印任何内容,但这是偶然的,因为现在有时我得到当我应该获取 tof 数据时获取热数据,反之亦然,或者我只获取其中的两个
最佳答案
在 read_data()
中,您不能期望通过一次 n = read(fd, buf, BUFFER_SIZE)
调用就可以获得所有数据。显然,第一个 read
调用只产生第一个数据字节,因此您必须继续读取数据并将数据附加到 buf
中,直到所有数据都到达。 (当然为此,您要么必须知道发送了多少字节,要么必须知道如何识别结束。)
关于c++ - Jetson TX2、Arduino Uno 串口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55006918/
我按照说明操作 here用于设置 wpf 主机,但应用程序启动时从未加载我的代码。我还尝试让 WASM 调试工作但没有成功。也就是说,如果可能的话,我宁愿拥有一个 wpf 主机,因为我认为这将提供更快
我正在尝试在 Arduino UNO 上执行算法,它需要包含一些大数字的常量表,有时,我会得到溢出值。这个数字就是这种情况:628331966747.0 好吧,这是一个大的,但它的类型是 float(
当我运行 Wasm 应用程序头时,在应用程序 UI 出现之前,最初会出现 Uno 平台启动画面(带有白色背景)。有时,启动画面图像 (splashscreen.scale-200.png) 及其指定的
我正在尝试让 HTML 文件上传控件在 WASM 上运行。到目前为止,我已尝试执行以下操作: [HtmlElement("input")] public class FilePickerView :
我想使用 16MHz Arduino Uno (ATMEGA328P) 设置自定义频率 (12Hz) 和占空比 (20%)。 AVR 计算器产量: ICR1 = 20833 OCR1A = 4167
我想使用 16MHz Arduino Uno (ATMEGA328P) 设置自定义频率 (12Hz) 和占空比 (20%)。 AVR 计算器产量: ICR1 = 20833 OCR1A = 4167
我尝试使用以下方法,但它们在 Uno (Android) 中都显示为未实现。我能做什么? 是否有任何 Xamarin.Essentials 替代品? 或其他NuGet 包? 或者我应该在每个平台上使用
我有一个基于 un uno 平台的简单应用程序。在 Windows 上,我可以毫无问题地构建和运行它。但是在 VS for Mac 上,编译器对自动生成的 RemoteControl.g.cs 文件给
我有一个问题,我只是尝试添加新文本,然后对其应用 LibreOffice 样式。我想添加文本并使其遵循特定样式(“标题 1”、“标题 2”等)。 向文档添加文本确实有效,更改样式也有效,但最后的样式集
Closed. This question needs debugging details。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。 上个月关闭。 I
我正在尝试读取RFID标签号由视差 RFID 阅读器扫描并使用 Arduino 设备发送到计算机。我正在尝试使用RXTXCommDrive从串行端口读取数据,但问题是当Arduino连接到PC时,它连
作为我正在进行的项目的一部分,我收到了一个 arduino uno 和一些代码。我以前从未与他们合作过,所以这对我来说是一次全新的体验。 我正在使用他们网站上的 Arduino 应用程序,当我编译代码
这是我的页面 HTML 代码。我这里使用了JQuery。 ESP8266 LED 控制 tags below the ID attribute is the value sent to the ar
我得到了我的 Arduino Uno,昨天碰巧停止被计算机识别。电路板上的红色 LED 工作正常,所以这是一个好兆头,但是当我通过 USB 连接它时,它不会在下方通知我-某些设备已连接的屏幕右侧。同样
我正在尝试在 Uno 平台上将音频流和视频流合并到一个文件中,特别是对于 WebAssembly。 我已经知道正常的、仅限桌面的方法是调用 ffmpeg ,而且我还找到了 UWP here 的唯一 C
有谁知道是否有办法在 Uno-Platform 应用程序中嵌入 OpenGL View ?我需要它在 iOS、macOS、Android 和 UWP 上工作。我有很多 C#/Xamarin 代码我想重
我需要帮助,我正在使用 Arduino UNO 和 GPRS 扩展板,它由输出 12v 500mA 的适配器供电。 SIM 卡放置正确,我用 AT+CPIN? 命令检查了这一点,但是当我尝试用 AT+
我需要帮助,我正在使用 Arduino UNO 和 GPRS 扩展板,它由输出 12v 500mA 的适配器供电。 SIM 卡放置正确,我用 AT+CPIN? 命令检查了这一点,但是当我尝试用 AT+
我是一名尝试硬件的程序员 我正在尝试连接我在网上购买的 SIM900 扩展板。因此,我按照大量教程将 SIM 扩展板与 Arduino UNO 连接起来。 嗯,事情进展得不太顺利。 我在里面放了一个解
我一直在 ATMega328P 上试验 PWM 波形生成模式。我得到了一些奇怪的结果,我无法确定是我编写固件的方式有问题还是我解释 datasheet 的方式有问题。 . 这是我为模拟 analogW
我是一名优秀的程序员,十分优秀!