我作为TinyOS入门新手,在学习串口通信和无线通信时遇到不少问题。本文主要是给出一个自己写的示例程序。无线传感器节点收到其他节点的数据通过串口发送给PC,PC通过串口发送指令到节点,节点再通过无线广播PC发送的指令。
项目包含3个文件:Makefile、SerialC.nc、SerialAppC.nc。
Makefile
COMPONENT=SerialAppC
include $(MAKERULES)
SerialAppC.nc
configuration SerialAppC
{
}
implementation
{
components MainC, SerialC, LedsC, ActiveMessageC;
components PlatformSerialC;
components SerialC as App;
components new TimerMilliC() as Timer0;
components new AMSenderC(6);
components new AMReceiverC(6);
App -> MainC.Boot;
App.Leds -> LedsC;
App.Timer0->Timer0;
App.StdControl->PlatformSerialC.StdControl;
App.UartStream->PlatformSerialC.UartStream;
App.RadioSend -> AMSenderC;
App.RadioPacket -> AMSenderC;
App.RadioAMPacket -> AMSenderC;
App.RadioControl -> ActiveMessageC;
App.RadioReceive -> AMReceiverC;
}
SerialC.nc
module SerialC
{
uses interface Leds;
uses interface Boot;
uses interface Timer<TMilli> as Timer0;
uses interface Packet as RadioPacket;
uses interface AMPacket as RadioAMPacket;
uses interface AMSend as RadioSend;
uses interface Receive as RadioReceive;
uses interface SplitControl as RadioControl;
uses interface StdControl;
uses interface UartStream;
}
implementation
{
uint32_t count=0;
uint8_t buff[2];
bool radiobusy=FALSE;
bool serialbusy=FALSE;
message_t pkt;
typedef nx_struct RadioMsg
{
nx_uint16_t nodeid;
nx_uint16_t count;
}RadioMsg;
void setLeds(uint16_t val)
{
if (val & 0x01)
call Leds.led0On();
else
call Leds.led0Off();
if (val & 0x02)
call Leds.led1On();
else
call Leds.led1Off();
if (val & 0x04)
call Leds.led2On();
else
call Leds.led2Off();
}
event void Boot.booted()
{
call RadioControl.start();
call StdControl.start();
}
event void Timer0.fired(){}
async event void UartStream.sendDone(uint8_t *buf,uint16_t len,error_t error)
{
serialbusy=FALSE;
}
async event void UartStream.receivedByte(uint8_t byte)
{
call Leds.led2Toggle();
setLeds(byte);
if(!radiobusy)
{
RadioMsg* btrpkt=(RadioMsg*)(call RadioPacket.getPayload(&pkt,sizeof(RadioMsg)));
btrpkt->nodeid=TOS_NODE_ID;
btrpkt->count=byte;
if(call RadioSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(RadioMsg))==SUCCESS)
radiobusy=TRUE;
}
}
async event void UartStream.receiveDone(uint8_t *buf,uint16_t len,error_t error)
{
}
event void RadioControl.startDone(error_t err)
{
}
event void RadioControl.stopDone(error_t err)
{
}
event void RadioSend.sendDone(message_t* msg,error_t error)
{
if(&pkt==msg)
radiobusy=FALSE;
}
event message_t* RadioReceive.receive(message_t* msg,void *payload,uint8_t len)
{
call Leds.led1Toggle();
if(len==sizeof(RadioMsg))
{
RadioMsg* btrpkt =(RadioMsg*)payload;
buff[0]=btrpkt->nodeid;
buff[1]=btrpkt->count;
}
if(!serialbusy)
{
serialbusy=TRUE;
call UartStream.send(buff, sizeof(buff) );
}
return msg;
}
}
以上内容仅供初学者参考。