我的目的是使用Arduino使用HC-05蓝牙模块在PC和Android设备之间建立通信。
我使用PC和Arduino(串行监视器)之间的USB通信和SoftwareSerial连接到HC-05。
我的问题是,从BT到PC的通信运行良好,但在其他方面无法正常工作。当从PC发送到BT时,只有当我关闭PC上的串行监视器或重置Arduino时,BT设备才会收到所有发送的字符。
我已经排除了BT模块或Android应用程序的问题,因为如果在Arduino中我实现了“ECHO”代码(在Android中编写并在Android中发送)一切正常。
在下面发布的Arduino代码预期的行为是:Arduino reset-> Hello word发送,Serial monitor打开 - >没有任何反应,字符写在串行监视器上 - >在BT上收到的字符,写在BT上的字符>在串行监视器上接收的字符,串行监视器关闭 - >没有任何反应。
真正的行为是:Arduino重置 - > Hello word发送,Serial monitor打开 - > 2 BT上的Hello字和PC上的1(“晚安”),写在串行监视器上的字符 - >没什么,写在BT-上的字符>在串行监视器上接收的字符,串行监视器关闭 - >收到串行监视器中的先前书写字符+ Hello Word。
如何解决此问题?
代码:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int a=0;
char c;
char d;
void setup() {
Serial.begin(9600);
Serial.println("Goodnight moon!");
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop() {
delay(10);
if (Serial.available()) {
c=Serial.read();
delay(10);
Serial.write(c);
}
delay(10);
if (mySerial.available()) {
d=mySerial.read();
delay(10);
mySerial.write(d);
}
}
答案 0 :(得分:3)
此代码适用于使用HC-05的Arduino Mini Pro(应与UNO相同)。我把HC-05与我的笔记本电脑配对。在与HC-05和Arduino串行控制台关联的COM端口上使用HyperTerminal,我可以双向发送消息。 Serial.println语句显示在Hyperterminal窗口中,就像它们应该的那样。
#include <SoftwareSerial.h>
#define rxPin 8
#define txPin 7
SoftwareSerial mySerial(rxPin, txPin); // RX, TX
char myChar ;
void setup() {
Serial.begin(9600);
Serial.println("Goodnight moon!");
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop(){
while(mySerial.available()){
myChar = mySerial.read();
Serial.print(myChar);
}
while(Serial.available()){
myChar = Serial.read();
mySerial.print(myChar);
}
}
答案 1 :(得分:2)
我已经在Arduino Uno和PC之间实现了串行通信,这是我的代码,希望它可以提供帮助:
int data;
char character;
int start_flag = 0;
void setup() {
Serial.begin(921600);
pinMode(2, OUTPUT);
}
void loop() {
if(Serial.available() > 0){
character = (char) Serial.read();
if(character == 's') {
start_flag = 1;
}
if(character == 't') {
start_flag = 0;
}
}
if (start_flag == 1) {
Serial.print(data); //data that was acquired by internal ADC
}
}
答案 2 :(得分:0)
您可以尝试this。这是关于测试Arduino bluetooth时可以使用的最简单的代码&lt; - &gt; C#沟通。注意:通过连接PIN1(TX)&lt; - &gt;来测试代码。 MODULE RX,PIN2(RX)&lt; - &gt; MODULE TX并将PIN1(TX)5V分压至2.5V,然后再送入模块。
希望这有助于所有尝试此事的人!
答案 3 :(得分:0)
使用此串行设置。使用此代码,我可以从串行监视器
接收并向蓝牙发送日期void setup(){
Serial.begin(9600); // Begin the serial monitor at 9600bps
bluetooth.begin(115200); // The Bluetooth Mate defaults to 115200bps
bluetooth.print("$"); // Print three times individually
bluetooth.print("$");
bluetooth.print("$"); // Enter command mode
delay(100); // Short delay, wait for the Mate to send back CMD
bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity
// 115200 can be too fast at times for NewSoftSerial to relay the data reliably
bluetooth.begin(9600); // Start bluetooth serial at 9600
pinMode(led, OUTPUT);
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
}
答案 4 :(得分:0)
我建议使用此应用进行测试:
https://play.google.com/store/apps/details?id=com.vagoscorp.virtualterminal
它允许您查看和发送字节作为字节(数字从0b00000000到0b11111111(0到255十进制)) 所以你可以制作一个简单的echo固件来测试你的波特率是否正确并且工作正常,开始发送命令来打开/关闭某些LED
这是一个回音代码示例:
$url="http://www.agoda.com/world.html";
$html=file_get_contents($url);
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath0 = new DOMXPath($dom);
$locs = $xpath0->evaluate("//a");
for ($x = 0; $x < 20; $x++) {
$location=$locs->item($x)->nodeValue;
$locationurl="http://www.agoda.com".$locs->item($x)->getAttribute('href');
print("$x. $location,$locationurl<br />");
}
我希望它可以帮到你
答案 5 :(得分:0)
出现同样的问题,您必须在有线侧和无线电侧将BT模块视为2种不同的波特率。无线电侧通过腻子连接的任何一个设置,有线侧通过AT命令编程。 HC-05默认为38400。