Arduino IR发送ASCII码,等待,发送,读取
我需要帮助建立一个“简单”的arduino代码来发送和接收红外信号 我尝试了互联网上的几种代码,但没有一种适合我的Logarex电表。 比如: 通信由IEC 62056-21完成。 我想和我的电表握手 0x2F、0x3F、0x21.0x0D、0x0A 然后是数据请求 0x06.0x30.0x35.0x30.0x0D,0x0A 收入 不幸的是,我无法得到任何信息。通过红外发射器发送握手,然后请求数据,然后开始通过红外接收器接收数据,这是否容易? 我是否需要在波特率300上进行通信以握手,然后在下一部分中进行9600通信并在IR RX中接收9600Arduino IR发送ASCII码,等待,发送,读取,arduino,Arduino,我需要帮助建立一个“简单”的arduino代码来发送和接收红外信号 我尝试了互联网上的几种代码,但没有一种适合我的Logarex电表。 比如: 通信由IEC 62056-21完成。 我想和我的电表握手 0x2F、0x3F、0x21.0x0D、0x0A 然后是数据请求 0x06.0x30.0x35.0x30.0x0D,0x0A 收入 不幸的是,我无法得到任何信息。通过红外发射器发送握手,然后请求数据,然后开始通过红外接收器接收数据,这是否容易? 我是否需要在波特率300上进行通信以握手,然后在下
The output should be something like this on an arduino serial monitor.
Baudrate: 300 bps, 7 bits, parity even, 1 stop bit
Send: /?!<CR><LF> (wake-up and sign-on)
Receive: /XXX5YYYYY<CR><LF> (XXX is the manufacturer ID; YYYYY is the meter ID; 5 is the new baudrate = 9600 bps)
Send: <ACK>050<CR><LF> (send ack; reading mode)
Baudrate: 9600 bps, 7 bits, parity even, 1 stop bit
Received: C.1(201236731.0(01:39 25-08-18)
1.8.1(0004398506*Wh)
1.8.2(0000000000*Wh)
1.8.3(0008198809*Wh)
1.8.4(0000000000*Wh)
1.8.5(0000000000*Wh)
1.8(0012597315*Wh)
2.8(0000000000*Wh)
!
D
在arduino串行监视器上的输出应该是这样的。
波特率:300 bps,7位,奇偶校验,1停止位
发送:/?!(唤醒并登录)
接收:/XXX5YYYYY(XXX是制造商ID;YYYYY是仪表ID;5是新波特率=9600 bps)
发送:050(发送确认;读取模式)
波特率:9600 bps,7位,奇偶校验,1停止位
收到:C.1(201236731.0(01:39 25-08-18)
1.8.1(0004398506*Wh)
1.8.2(0000000000*Wh)
1.8.3(0008198809*Wh)
1.8.4(0000000000*Wh)
1.8.5(0000000000*Wh)
1.8(0012597315*Wh)
2.8(0000000000*Wh)
!
D
谢谢大家的帮助,我是一名初学者,没有IR方面的经验。如果您使用arduino uno,标准库不支持初始查询所需的7E1。为此,您必须编写自己的uart驱动程序 你需要写接收部分,我在提供想法方面与你分享
//Description video : https://www.youtube.com/watch?v=2s4W6sOT0mU
typedef struct uconfig
{
uint32_t baud;
uint8_t _UBRR0H;
uint8_t _UBRR0L;
uint8_t _UCSR0B;
uint8_t _UCSR0C;
} baud_registers;
/*
* How can i calculate _UBRROH and _UBRR0L. Here is the cpp script.
* You need to check the atmega328p datasheet to understand
*
#include <iostream>
#define BAUDRATE 300
#define _UBRR (((16000000 / (BAUDRATE * 16UL))) - 1)
int main()
{
int msb= ((_UBRR) & 0xF00);
int lsb = ((_UBRR) & 0xFF);
if(msb>256)
{
msb= msb>>8;
}
std::cout<<"msb: " << msb;
std::cout<<"\n";
std::cout<<"lsb : "<<lsb;
}
*
*
*/
static const uconfig baud_table[]= {
{300,0x0D,0x04,0x18,0x24},
};
int uart_init(uint32_t baudRate_u32)
{
int status=0;
uint8_t i=0;
for( i=0; i< sizeof(baud_table)/sizeof(baud_table[0]); i++)
{
if(baud_table[i].baud == baudRate_u32)
{
break;
}
}
if( i < sizeof(baud_table)/sizeof(baud_table[0])) {
UBRR0H=baud_table[i]._UBRR0H;
UBRR0L=baud_table[i]._UBRR0L;
UCSR0B=baud_table[i]._UCSR0B;
UCSR0C=baud_table[i]._UCSR0C;
status=1;
}
return status;
}
void USART_transmit( unsigned char data ) {
while(!(UCSR0A & (1 << UDRE0)));
UDR0 = data;
}
void setup() {
while(!uart_init(300));
}
void loop() {
USART_transmit('a');
delay(1000);
}
//描述视频:https://www.youtube.com/watch?v=2s4W6sOT0mU
类型定义结构uconfig
{
uint32_t波特;
uint8_t_UBRR0H;
uint8_t_UBRR0L;
uint8_t_UCSR0B;
uint8_t_UCSR0C;
}波特率寄存器;
/*
*如何计算_UBRROH和_UBRR0L。这是cpp脚本。
*您需要查看atmega328p数据表才能理解
*
#包括
#定义波特率300
#定义_UBRR((16000000/(波特率*16UL))-1)
int main()
{
int msb=((uUBRR)和0xF00);
int lsb=((uubrr)和0xFF);
如果(msb>256)
{
msb=msb>>8;
}
标准::cout