- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个蓝牙设备(来自 bluegiga 的 bled112)。其中之一连接到 RPI 并从其他设备接收 RSSI 和硬件地址。它在 Windows 和 ubuntu 上运行良好,但在树莓派上,从设备文件 (/dev/ttyACM0) 读取时出现问题。
我正在使用 Wheezy 3.6.11,全部更新,安装了 bluez。
这是我的程序,我用来阅读的内容:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include "cmd_def.h"
volatile int serial_fd;
void output(uint8 len1, uint8* data1, uint16 len2, uint8* data2)
{
int written;
written = write(serial_fd, data1, len1);
if(written < 0) {
fprintf(stderr, "ERROR: Writing data. %d\n", (int)errno);
exit(-1);
}
printf("WRITE1: %d bytes ; ", written);
written = write(serial_fd, data2, len2);
if(written < 0) {
fprintf(stderr, "ERROR: Writing data. %d\n", (int)errno);
exit(-1);
}
printf("WRITE2: %d bytes\n", written);
}
int read_message()
{
int rread;
const struct ble_msg *apimsg;
struct ble_header apihdr;
unsigned char data[256];//enough for BLE
//read header
printf("\t\tread_message entered\n");
rread = read(serial_fd, (unsigned char*)&apihdr, 4);
if(rread < 0) {
return errno;
} else if(!rread) {
return 0;
}
printf("READ: header %d bytes ; ", rread);
//read rest if needed
if(apihdr.lolen)
{
rread = read(serial_fd, data, apihdr.lolen);
if(rread < 0) {
return errno;
}
}
printf("READ: data %d bytes ; ", rread);
apimsg=ble_get_msg_hdr(apihdr);
if(!apimsg)
{
fprintf(stderr, "ERROR: Message not found:%d:%d\n",(int)apihdr.cls, (int)apihdr.command);
return -1;
}
apimsg->handler(data);
return 0;
}
int main(int argc, char *argv[] )
{
char* portname;
portname = "/dev/ttyACM0";
serial_fd = open(portname, O_RDWR | O_SYNC);
if (serial_fd < 0)
{
fprintf (stderr, "error %d opening %s: %s", errno, portname, strerror (errno));
return -1;
}
bglib_output = output;
//stop previous operation
ble_cmd_gap_end_procedure();
//get connection status,current command will be handled in response
ble_cmd_connection_get_status(0);
//Message loop
while(1)
{
if(read_message())
{
fprintf(stderr, "Error reading message\n");
break;
}
}
return 0;
}
RPI 的输出是:
$ sudo scanApp
WRITE1: 4 bytes ; WRITE2: 0 bytes
WRITE1: 5 bytes ; WRITE2: 0 bytes
read_message entered
在这部分之后,它在读取函数中无限运行。如果有人能告诉我,为什么它在树莓派上不起作用,我将不胜感激?
编辑:找到了 uart 的解决方案:
#include <termios.h>
int serial_handle;
int uart_open(char *port){
struct termios options;
int i;
serial_handle = open(port, (O_RDWR | O_NOCTTY));
if(serial_handle < 0)
return -1;
tcgetattr(serial_handle, &options); //get the current options for the port...
cfsetispeed(&options, B115200); //set Baud rate to 115200
cfsetospeed(&options, B115200); //enable the receiver and set param...
options.c_cflag &= ~(PARENB | CSTOPB | CSIZE | CRTSCTS | HUPCL);
options.c_cflag |= (CS8 | CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOE | ECHOK | ECHONL | ECHOCTL | ECHOPRT | ECHOKE | IEXTEN);
options.c_iflag &= ~(INPCK | IXON | IXOFF | IXANY | ICRNL);
options.c_oflag &= ~(OPOST | ONLCR);
for ( i = 0; i < sizeof(options.c_cc); i++ )
options.c_cc[i] = _POSIX_VDISABLE;
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 1;
//set new opt for the port
tcsetattr(serial_handle, TCSAFLUSH, &options);
return 0;
}
int uart_close(){
close(serial_handle);
}
//write to uart_port
int uart_tx(int len, unsigned char *data){
ssize_t written;
while(len){
written = write(serial_handle, data, len);
if(!written)
return -1;
len -= written;
data += len;
}
return 0;
}
//read from uart_port
int uart_rx(int len, unsigned char *data, int timeout_ms){
int l=len;
ssize_t rread;
struct termios options;
tcgetattr(serial_handle, &options);
options.c_cc[VTIME] = timeout_ms/100;
options.c_cc[VMIN] = 0;
tcsetattr(serial_handle, TCSANOW, &options);
while(len){
rread = read(serial_handle, data, len);
if(!rread){
return 0;
} else if(rread < 0) {
return -1;
}
len-=rread;
data+=len;
}
return l;
}
int main(){
char* portname = "/dev/ttyACM0";
serial_fd = uart_open(portname);
if (serial_fd < 0){
fprintf (stderr, "error %d opening %s: %s", errno, portname, strerror (errno));
return -1;
}
bglib_output = output;
//reset dongle
ble_cmd_system_reset(0);
uart_close();
do{
usleep(500000);
//and start again
}while(uart_open(portname));
//stop previous operation
ble_cmd_gap_end_procedure();
//get connection status,current command will be handled in response
ble_cmd_connection_get_status(0);
//Message loop
while(1){
if(read_message()){
fprintf(stderr, "Error reading message\n");
break;
}
}
uart_close();
return 0;
}
在 output() 中使用:
written = uart_tx(len1, data1);
written = uart_tx(len2, data2);
在 read_message() 中:
rread = uart_rx(sizeof(apihdr), (unsigned char*)&apihdr, 1000);
rread = uart_rx(apihdr.lolen, data, 1000);
最佳答案
如果 Java 是在您的 Raspberry Pi 上运行的一个选项,您可以 try this BLE 112 Java API
收件人install Java on the Raspberry Pi sudo apt-get update && sudo apt-get install oracle-java7-jdk
关于raspberry-pi - 树莓派和 BLED112 (Bluegiga),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15879764/
我有一个运行 Raspbian 的 Raspberry Pi 1。我尝试在 Raspberry Pi 3 上运行 SD 卡,但它没有启动。 我已经阅读了有关升级 Raspberry Pi 2 安装以在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我目前正在尝试RadiusNetworks发布的Raspberry Pi iBeacon教程,网址为 http://developer.radiusnetworks.com/2013/10/09/ho
我的公司使用 Raspberry Pi 3 作为产品中的嵌入式 Controller 。用户不会优雅地关闭它,他们只是扳动一个开关。为避免损坏,/boot 和/root 文件系统是只读的。这似乎是防弹
如何使用 Raspberry Pi 作为 b/w USB Tethered 手机和路由器的桥接器,使用“以太网电缆 b/w Raspberry Pi 和路由器”和“USB 电缆 b/w 手机和 Ras
我关注了一个名为Creating an Electron Application for the Raspberry Pi的博客,内容涉及使用Buster OS在Raspberry Pi中启动Elec
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有一个树莓派,并且已经从 raspbmc.com 加载了最新的独立版本。在使用 XBMC 时,我看到 CPU 使用率始终在 90% 以上。查看 XBMC wiki 和常见问题解答后,脏区域似乎是减少
我现在正在做一个小项目。我希望 python 脚本在登录到 GUI 后自动运行。 我按照这里的步骤操作:https://www.raspberrypi.org/forums/view ... 91&t
我正在使用 Android Things 在 Raspberry Pi 上构建应用程序并且我有 7 inch touch screen ,但屏幕永远不会关闭。 是否可以像 Android 手机一样设置
我正在执行一组事件以确保 Redis 在一组嵌入式系统(包括 Raspberry PI)中运行良好。为了修复执行未对齐内存访问的 Redis 的某些代码路径(由于 Redis 3.2 中引入的更改),
我正在尝试使用 Tanuki Java Service Wrapper。 我使用的硬件是带有 Raspbian wheezy 发行版的 Raspberry Pi。 (见 http://www.rasp
我希望构建一个以全屏模式在 Raspberry Pi 上运行的应用程序。我已经尝试过 JavaFX 和基于 Swing 的应用程序,但性能非常糟糕。 在我开始使用 SDL( http://www.li
我的项目在/home/pi/app中 以npm start开头 启动操作系统后如何启动应用程序? ****西类牙文 Mi proyecto esta zh/home/pi/app Arranca la
我正在尝试安装 Kappelt gBridge在 Raspberry Pi 3 B 型上,使用本指南:https://doc.gbridge.io/selfHosted/hostItYourself.
我正在使用我的 Pi 作为文件服务器,最近当我登录时,我看到一条错误消息,指出 libarmmem.so(无法打开共享对象文件),尽管有一些建议运行 apt-get update + 升级它并没有带来
我正在尝试使用 Raspberry# 库通过 Raspberry PI 上的 GPIO 引脚(打开和关闭)执行基本任务。根据 github 上的示例:https://github.com/raspbe
如标题所述,我在将一些用户空间中断代码从另一个 armv7 嵌入式 linux 平台移植到 Raspberry Pi 2 Model B 时遇到问题。 我知道 wiringPi 库(并让它以这种方式工
我正在尝试为 Raspberry Pi B+ 交叉编译 Tensorflow-Lite。为此,我正在关注 these instructions来自官方网站,它们是: git clone https:/
我正在尝试使用 PulseAudio RTP 将音频从 Linux Mint 桌面流式传输到运行 LibreELEC (Kodi) 的 RaspberryPi 3B。我可以使用 RTP 多播成功地流式
我是一名优秀的程序员,十分优秀!