Wire.endTransmission line之后未执行Arduino代码

Wire.endTransmission line之后未执行Arduino代码,arduino,wii,Arduino,Wii,我正在做一个项目,将任天堂Nunchuk与Arduino同步。我在网上找到了相同的代码 这是代码 #include <Wire.h>; void setup(){ Serial.begin(19200); nunchuck_setpowerpins(); nunchuck_init(); Serial.print("Nunchuck ready\n"); } void loop(){ nunchuck_get_data(); nunchuck_print_data(); dela

我正在做一个项目,将任天堂Nunchuk与Arduino同步。我在网上找到了相同的代码

这是代码

#include <Wire.h>;

void setup(){
Serial.begin(19200);
nunchuck_setpowerpins();
nunchuck_init();
Serial.print("Nunchuck ready\n");
}

void loop(){
nunchuck_get_data();
nunchuck_print_data();
delay(1000);
}
//======================================================================================================================================================================================================//
//Do not modify!!!!!!!!
//======================================================================================================================================================================================================//


//
// Nunchuck functions
//

static uint8_t nunchuck_buf[6]; // array to store nunchuck data,

// Uses port C (analog in) pins as power & ground for Nunchuck

static void nunchuck_setpowerpins()
{
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
delay(100); // wait for things to stabilize
}

// initialize the I2C system, join the I2C bus,
// and tell the nunchuck we're talking to it
void nunchuck_init()
{
Wire.begin();    // join i2c bus as master
Wire.beginTransmission(0x52);   // transmit to device 0x52
Wire.send(0x40);     // sends memory address
Wire.send(0x00);     // sends sent a zero.
Wire.endTransmission(); // stop transmitting
}

// Send a request for data to the nunchuck
// was "send_zero()"
void nunchuck_send_request()
{
Wire.beginTransmission(0x52);   // transmit to device 0x52
Wire.send(0x00);     // sends one byte
Wire.endTransmission(); // stop transmitting
}

// Receive data back from the nunchuck,
// returns 1 on successful read. returns 0 on failure
int nunchuck_get_data()
{
int cnt=0;
Wire.requestFrom (0x52, 6); // request data from nunchuck
while (Wire.available ()) {
// receive byte as an integer
nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.receive());
cnt++;
}
nunchuck_send_request(); // send request for next data payload
// If we recieved the 6 bytes, then go print them
if (cnt >= 5) {
return 1; // success
}
return 0; //failure
}

// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits. That is why I
// multiply them by 2 * 2
void nunchuck_print_data()
{
static int i=0;
int joy_x_axis = nunchuck_buf[0];
int joy_y_axis = nunchuck_buf[1];
int accel_x_axis = nunchuck_buf[2]; // * 2 * 2;
int accel_y_axis = nunchuck_buf[3]; // * 2 * 2;
int accel_z_axis = nunchuck_buf[4]; // * 2 * 2;

int z_button = 0;
int c_button = 0;

// byte nunchuck_buf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]
if ((nunchuck_buf[5] >> 0) & 1)
z_button = 1;
if ((nunchuck_buf[5] >> 1) & 1)
c_button = 1;

if ((nunchuck_buf[5] >> 2) & 1)
accel_x_axis += 2;
if ((nunchuck_buf[5] >> 3) & 1)
accel_x_axis += 1;

if ((nunchuck_buf[5] >> 4) & 1)
accel_y_axis += 2;
if ((nunchuck_buf[5] >> 5) & 1)
accel_y_axis += 1;

if ((nunchuck_buf[5] >> 6) & 1)
accel_z_axis += 2;
if ((nunchuck_buf[5] >> 7) & 1)
accel_z_axis += 1;

Serial.print(i,DEC);
Serial.print("\t");

Serial.print("joy:");
Serial.print(joy_x_axis,DEC);
Serial.print(",");
Serial.print(joy_y_axis, DEC);
Serial.print(" \t");

Serial.print("acc:");
Serial.print(accel_x_axis, DEC);
Serial.print(",");
Serial.print(accel_y_axis, DEC);
Serial.print(",");
Serial.print(accel_z_axis, DEC);
Serial.print("\t");

Serial.print("but:");
Serial.print(z_button, DEC);
Serial.print(",");
Serial.print(c_button, DEC);

Serial.print("\r\n"); // newline
i++;
}

// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}

// returns zbutton state: 1=pressed, 0=notpressed
int nunchuck_zbutton()
{
return ((nunchuck_buf[5] >> 0) & 1) ? 0 : 1; // voodoo
}

// returns zbutton state: 1=pressed, 0=notpressed
int nunchuck_cbutton()
{
return ((nunchuck_buf[5] >> 1) & 1) ? 0 : 1; // voodoo
}

// returns value of x-axis joystick
int nunchuck_joyx()
{
return nunchuck_buf[0];
}

// returns value of y-axis joystick
int nunchuck_joyy()
{
return nunchuck_buf[1];
}

// returns value of x-axis accelerometer
int nunchuck_accelx()
{
return nunchuck_buf[2]; // FIXME: this leaves out 2-bits of the data
}

// returns value of y-axis accelerometer
int nunchuck_accely()
{
return nunchuck_buf[3]; // FIXME: this leaves out 2-bits of the data
}

// returns value of z-axis accelerometer
int nunchuck_accelz()
{
return nunchuck_buf[4]; // FIXME: this leaves out 2-bits of the data
}
#包括;
无效设置(){
连载《开始》(19200);
nunchuck_setpowerpins();
nunchuck_init();
Serial.print(“Nunchuck ready\n”);
}
void循环(){
nunchuck_get_data();
nunchuck_print_data();
延迟(1000);
}
//======================================================================================================================================================================================================//
//不要修改!!!!!!!!
//======================================================================================================================================================================================================//
//
//Nunchuck函数
//
静态uint8_t nunchuck_buf[6];//用于存储nunchuck数据的数组,
//使用端口C(模拟输入)引脚作为Nunchuck的电源和接地
静态无效NUNCUCK_setpowerpins()
{
#在PORTC3中定义pwrp
#在PORTC2中定义gndp
DDRC |=_BV(pwrpin)| u BV(gndpin);
PORTC&=~\u BV(gndpin);
PORTC |=_BV(pwrpin);
延迟(100);//等待事情稳定下来
}
//初始化I2C系统,连接I2C总线,
//告诉修女们我们在和它说话
void nunchuck_init()
{
Wire.begin();//将i2c总线作为主总线连接
Wire.beginTransmission(0x52);//传输到设备0x52
Wire.send(0x40);//发送内存地址
Wire.send(0x00);//发送一个零。
Wire.endTransmission();//停止传输
}
//向nunchuck发送数据请求
//是“send_zero()”
无效发送请求()
{
Wire.beginTransmission(0x52);//传输到设备0x52
Wire.send(0x00);//发送一个字节
Wire.endTransmission();//停止传输
}
//从nunchuck接收数据,
//成功读取时返回1。失败时返回0
int nunchuck_get_data()
{
int-cnt=0;
Wire.requestFrom(0x52,6);//从nunchuck请求数据
while(Wire.available()){
//以整数形式接收字节
nunchuck_buf[cnt]=nunchuk_decode_字节(Wire.receive());
cnt++;
}
nunchuck_send_request();//发送下一个数据有效负载的请求
//如果我们收到了6个字节,那么就去打印它们
如果(cnt>=5){
返回1;//成功
}
返回0;//失败
}
//打印我们收到的输入数据
//加速度数据的长度为10位
//所以我们读8位,然后我们必须加上
//在最后2位。这就是为什么我
//将它们乘以2*2
作废打印数据()
{
静态int i=0;
int joy_x_轴=nunchuck_buf[0];
int joy_y_轴=nunchuck_buf[1];
int accel_x_轴=nunchuck_buf[2];//*2*2;
int accel_y_轴=nunchuck_buf[3];//*2*2;
int accel_z_轴=nunchuck_buf[4];//*2*2;
int z_按钮=0;
int c_按钮=0;
//字节nunchuck_buf[5]包含z和c按钮的位
//它还包含加速计数据的最低有效位
//所以我们必须检查字节f[5]的每一位
如果((nunchuck_buf[5]>>0)和1)
z_按钮=1;
如果((nunchuck_buf[5]>>1)和1)
c_按钮=1;
如果((nunchuck_buf[5]>>2)和1)
加速度x轴+=2;
如果((nunchuck_buf[5]>>3)和1)
加速度x轴+=1;
如果((nunchuck_buf[5]>>4)和1)
加速度y轴+=2;
如果((nunchuck_buf[5]>>5)和1)
加速度y轴+=1;
如果((nunchuck_buf[5]>>6)和1)
加速度z轴+=2;
如果((nunchuck_buf[5]>>7)和1)
加速度z轴+=1;
连续打印(一、十二月);
串行打印(“\t”);
连载。打印(“joy:”);
串行打印(joy_x_轴,十二月);
连续打印(“,”);
串行打印(joy_y_轴,十二月);
串行打印(“\t”);
连续打印(“acc:”);
串行打印(加速x轴,DEC);
连续打印(“,”);
串行打印(加速度y轴,DEC);
连续打印(“,”);
串行打印(加速z轴,12);
串行打印(“\t”);
连载。打印(“但:”);
串行打印(z_按钮,DEC);
连续打印(“,”);
串行打印(c_按钮,DEC);
Serial.print(“\r\n”);//换行符
i++;
}
//将数据编码为大多数wiimote驱动程序的格式,除了
//只有当你使用一个普通的wiimote驱动程序时才需要
char nunchuk_解码_字节(char x)
{
x=(x^0x17)+0x17;
返回x;
}
//返回zbutton状态:1=已按下,0=未按下
int nunchuckzbutton()
{
返回((nunchuck_buf[5]>>0)和1)?0:1;//伏都教
}
//返回zbutton状态:1=已按下,0=未按下
int nunchuck_cbutton()
{
返回((nunchuck_buf[5]>>1)&1)?0:1;//伏都教
}
//返回x轴操纵杆的值
int nunchuck_joyx()
{
返回nunchuck_buf[0];
}
//返回y轴操纵杆的值
int NUNCUCK_joyy()
{
返回nunchuck_buf[1];
}
//返回x轴加速计的值
int nunchuck_accelx()
{
return nunchuck_buf[2];//FIXME:这样就省去了2位数据
}
//返回y轴加速计的值
int nunchuck_accely()
{
return nunchuck_buf[3];//FIXME:这样就省去了2位数据
}
//返回z轴加速计的值
int nunchuck_accelz()
{
return nunchuck_buf[4];//FIXME:这样就省去了2位数据
}
当我写入时,Serial.Println(“End”),在Wire.endTransmission()之后的行中;在函数nunchuck_init()中,它不会显示在串行监视器上

此外,它不会在串行监视器上显示Nunchuck ready,因为它是在调用Nunchuck_init()之后写入的。
我正在使用Arduino 0023和Windows 7。

库存Arduino Wire库存在的一个问题是没有超时。
endTransmission功能可以在不同的场景中挂起微控制器

这个问题已经在其他几篇文章中讨论过了,到目前为止,我发现最好的解决方案是使用一个备用库

Wayne Truchess的Arduino I2C主库

通过适当的超时,它修复了我的系统读取MMA7455 accelero时出现的问题

在提供的源代码中,有一个示例显示了如何使用Wire和I2C主库完成相同的程序。
您可以使用该示例轻松修改代码以采用新库。

首先,我建议使用最新的IDE版本。没有充分的理由用已知代码调试旧代码/库