Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino IR发送ASCII码,等待,发送,读取_Arduino - Fatal编程技术网

Arduino IR发送ASCII码,等待,发送,读取

Arduino IR发送ASCII码,等待,发送,读取,arduino,Arduino,我需要帮助建立一个“简单”的arduino代码来发送和接收红外信号 我尝试了互联网上的几种代码,但没有一种适合我的Logarex电表。 比如: 通信由IEC 62056-21完成。 我想和我的电表握手 0x2F、0x3F、0x21.0x0D、0x0A 然后是数据请求 0x06.0x30.0x35.0x30.0x0D,0x0A 收入 不幸的是,我无法得到任何信息。通过红外发射器发送握手,然后请求数据,然后开始通过红外接收器接收数据,这是否容易? 我是否需要在波特率300上进行通信以握手,然后在下

我需要帮助建立一个“简单”的arduino代码来发送和接收红外信号

我尝试了互联网上的几种代码,但没有一种适合我的Logarex电表。 比如:

通信由IEC 62056-21完成。 我想和我的电表握手 0x2F、0x3F、0x21.0x0D、0x0A 然后是数据请求 0x06.0x30.0x35.0x30.0x0D,0x0A 收入 不幸的是,我无法得到任何信息。通过红外发射器发送握手,然后请求数据,然后开始通过红外接收器接收数据,这是否容易? 我是否需要在波特率300上进行通信以握手,然后在下一部分中进行9600通信并在IR RX中接收9600

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