|
我在本論壇發(fā)過一個(gè)上下位機(jī)arduino通過iic互傳數(shù)據(jù)的程序,我對里面的這段代碼
//主程序
void loop()
{
delay(100);//延時(shí)
}
有點(diǎn)疑惑,我認(rèn)為程序會卡在那里不動(dòng),然而今天找了兩個(gè)arduino板子試了一下,居然是可以完成預(yù)期通信效果的,這是為啥,為啥loop這里卡不住程序?請指點(diǎn)。
- /*循環(huán)接受主機(jī)發(fā)送來的數(shù)據(jù)包,同時(shí)顯示在串口監(jiān)視器上
- 把數(shù)據(jù)包的最后一個(gè)字節(jié),再上傳回主機(jī)
- */
- #include <Wire.h>//聲明I2C庫文件
- int x;//變量x值決定主機(jī)的LED是否點(diǎn)亮
- //初始化
- void setup()
- {
- Wire.begin(4); // 加入 i2c 總線,設(shè)置從機(jī)地址為 #4
- Wire.onReceive(receiveEvent); //注冊接受到主機(jī)字符的事件
- Wire.onRequest(requestEvent); // 注冊主機(jī)通知從機(jī)上傳數(shù)據(jù)的事件
- Serial.begin(9600); //設(shè)置串口波特率
- }
- //主程序
- void loop()
- {
- delay(100);//延時(shí)
- }
- // 當(dāng)從機(jī)接受到主機(jī)字符,執(zhí)行該事件
- void receiveEvent(int howMany)
- {
- while( Wire.available()>1) // 循環(huán)執(zhí)行,直到數(shù)據(jù)包只剩下最后一個(gè)字符
- {
- char c = Wire.receive(); // 作為字符接受字節(jié)
- Serial.print(c); // 把字符打印到串口監(jiān)視器中
- }
- //接受主機(jī)發(fā)送的數(shù)據(jù)包中的最后一個(gè)字節(jié)
- x = Wire.receive(); // 作為整數(shù)接受字節(jié)
- Serial.println(x); //把整數(shù)打印到串口監(jiān)視器中,并回車
- }
- //當(dāng)主機(jī)通知從機(jī)上傳數(shù)據(jù),執(zhí)行該事件
- void requestEvent()
- {
- //把接受主機(jī)發(fā)送的數(shù)據(jù)包中的最后一個(gè)字節(jié)再上傳給主機(jī)
- Wire.send( x); // 響應(yīng)主機(jī)的通知,向主機(jī)發(fā)送一個(gè)字節(jié)數(shù)據(jù)
- }
復(fù)制代碼
|
|