前几天一直在生病,腹部感觉非常难受,经常感到恶心反胃。还胸闷气喘,走几步就累得不行,连坐着都觉得很费劲,只有在床上躺着才会舒服些。所以整整在床上躺了三天,几乎都没出宿舍门,米水也不沾,因为总感觉胃胀。直到昨天早晨起床时才觉得好点儿,至少能下床活动活动了。到今天又好了一些,上午还去上了课,午饭、晚饭也能正常饮食了。我想,这病应该算是熬过去了···
具体什么原因嘛,我也不清楚。可能是哪天夜里没盖好被子,着凉了,再加上前段时间不规律的作息方式,导致亏钱自己身体的债集中到一起爆发,要我还债了。养病的这几天也确实体会到了久违了的睡眠充足的快感,也跟自己的床铺好好亲密了一番。
但是,看看目前的情况,还是很不乐观呐!下周就有课程开始考试了,一直要考到7月1号,断断续续好几门课。别说复习要抓紧,有一些课程甚至从来都没预习过··· 还有更重要的是开发板的试用期也快结束了,我的项目基本上还处于研究学习阶段,还没开始正式进行自己的实验,而且soso姐都已经答应给我延长到7月了,我可千万不能辜负了她的好意!所以,这几天务必要全力以赴,抓紧时间把自己的项目做出来!
好了,闲话少说(老毛病了,呵呵 ),下面就来晒晒生病前后的一些学习成果。
首先,我上次解读的接收端demo_AP程序文件只有main()里面的内容,下面接着把文件剩下的部分解读完,也就是一些main()中调用的函数的定义:
/*------------------------------------------------------------------------------
*创建随机地址
------------------------------------------------------------------------------*/
void createRandomAddress()
{
unsigned int rand, rand2;
do
{
rand = TI_getRandomIntegerFromVLO();
}
while( (rand & 0xFF00)==0xFF00 || (rand & 0xFF00)==0x0000 );
rand2 = TI_getRandomIntegerFromVLO(); // 从VLO(片内超低功耗12KHz低频振荡器)获取整数数值,首字节不能为0x00或0xFF
BCSCTL1 = CALBC1_1MHZ; //#define BCSCTL1_ (0x0057u) /* 基础时钟模块控制寄存器1 */
// DEFC( BCSCTL1 , BCSCTL1_)
//#define CALBC1_1MHZ_ (0x10FFu) /* BCSCTL1分频因数数值*/
// READ_ONLY DEFC( CALBC1_1MHZ , CALBC1_1MHZ_)
DCOCTL = CALDCO_1MHZ; //这一句里的寄存器和参数和上面的类似,只不过是针对DCO(片内可数字控制振荡器)的
//这两句总的结果是设置DCO为1MHz,这样的语句在编程中也是经常用到的,应该熟练掌握
FCTL2 = FWKEY + FSSEL0 + FN1; // FCTL1、FCTL2、FCTL3是Flash控制寄存器
// #define FWKEY (0xA500) —口令码:写入为5AH
// #define FSSEL0 (0x0040u) —Flash 时钟选择为1 - MCLK
// #define FN1 (0x0002) —32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1=2*1+1=3
// 这一句的效果是选择MCLK并3分频作为Flash时序发生器
FCTL3 = FWKEY + LOCKA; // 清楚锁定位,使Flash可读
FCTL1 = FWKEY + WRT; // 置位WRT使Flash可写
Flash_Addr[0]=(rand>>8) & 0xFF;
Flash_Addr[1]=rand & 0xFF;
Flash_Addr[2]=(rand2>>8) & 0xFF;
Flash_Addr[3]=rand2 & 0xFF; //这四句是设置Flash地址为上面产生的随机地址
FCTL1 = FWKEY; // 清除WRT
FCTL3 = FWKEY + LOCKA + LOCK; // 锁定FLash,这两句的作用应该是保护上面设置的Flash地址
}
/*发送数据函数,该函数在main中最后一段处理节点信号语句中被调用,现在来详细分析其实参、形参及功能:
1,形参addr对应实参i,是发来信号的节点序号,要求不大于sNumCurrentPeers参数(现有节点数量);
2,形参rssi对应实参sigInfo.sigInfo[0],sigInfo是一个ioctlRadioSiginfo_t形式的参数,定义在nwk_types.h文件中:
typedef struct
{
linkID_t lid; //指定的信号信息输入端口(一个字节)
uint8_t sigInfo[MRFI_RX_METRICS_SIZE]; //#define MRFI_RX_METRICS_SIZE __mrfi_RX_METRICS_SIZE__(mrfi.h);#define __mrfi_RX_METRICS_SIZE__ 2(mrfi_CC2500_defs.h)—信号长度为两个字节
} ioctlRadioSiginfo_t;
这里只用了sigInfo[]数组的第一个元素sigInfo[0],但接收到的信号总共有1+2=3字节
3,形参char msg[MESSAGE_LENGTH](#define MESSAGE_LENGTH 3)对应实参main中uint8_t msg[MAX_APP_PAYLOAD](main中343行)
这里问一下,万一MAX_APP_PAYLOAD≠MESSAGE_LENGTH怎么办?形参、实参数组长度就配不上了呀
但这个msg其实就是main中331~333行的温度和电压数据存储数组。
4,这个函数和下一个函数transmitDataString( addrString, rssiString, msg )还只是预处理传送数据,
只是改变了addr和rssi的数据格式,真正的传送函数是调用的TXString()函数来实现的*/
void transmitData(int addr, signed char rssi, char msg[MESSAGE_LENGTH] )
{
char addrString[4];
char rssiString[3];
volatile signed int rssi_int;
addrString[0] = '0'; //转换地址数据格式
addrString[1] = '0';
addrString[2] = '0'+(((addr+1)/10)%10);
addrString[3] = '0'+((addr+1)%10);
rssi_int = (signed int) rssi; //转换信号强度数据格式
rssi_int = rssi_int+128;
rssi_int = (rssi_int*100)/256;
rssiString[0] = '0'+(rssi_int%10);
rssiString[1] = '0'+((rssi_int/10)%10);
rssiString[2] = '0'+((rssi_int/100)%10);
transmitDataString( addrString, rssiString, msg ); //把修改好的数据传送给transmitDataString( )函数
}
/*------------------------------------------------------------------------------
*
------------------------------------------------------------------------------*/
void transmitDataString(char addr[4],char rssi[3], char msg[MESSAGE_LENGTH] )
{
char temp_string[] = {" XX.XC"}; //X代表待定数值,C代表设定好的字符,temp_string[4] = '.'
int temp = msg[0] + (msg[1]<<8);
if( !degCMode ) //非摄氏度格式,即为华氏温度格式
{
temp = (((float)temp)*1.8)+320; //转化为华氏温度数值,若是摄氏温度格式则不需要这一步,因为上面在求temp是默认的就是摄氏温度数据格式
temp_string[5] = 'F';
}
if( temp < 0 ) //温度为负值,显示'-'并改为正数数值
{
temp_string[0] = '-';
temp = temp * -1;
}
else if( ((temp/1000)%10) != 0 ) //下面显示的是摄氏温度格式
{
temp_string[0] = '0'+((temp/1000)%10); //提取百位数值
}
temp_string[4] = '0'+(temp%10); //提取小数位数值
temp_string[2] = '0'+((temp/10)%10); //提取个位数值
temp_string[1] = '0'+((temp/100)%10); //提取十位数值
if( verboseMode ) //上面已经定义了verboseMode=1,即选择串口模式,下面就发送串口模式下的数据格式
{
char output_verbose[] = {"\r\nNode:XXXX,Temp:-XX.XC,Battery:X.XV,Strength:XXX%,RE:no "};
output_verbose[46] = rssi[2]; //强度数据
output_verbose[47] = rssi[1];
output_verbose[48] = rssi[0];
output_verbose[17] = temp_string[0]; //温度数据
output_verbose[18] = temp_string[1];
output_verbose[19] = temp_string[2];
output_verbose[20] = temp_string[3];
output_verbose[21] = temp_string[4];
output_verbose[22] = temp_string[5];
output_verbose[32] = '0'+(msg[2]/10)%10; //电压数据
output_verbose[34] = '0'+(msg[2]%10);
output_verbose[7] = addr[0]; //地址数据
output_verbose[8] = addr[1];
output_verbose[9] = addr[2];
output_verbose[10] = addr[3];
TXString(output_verbose, sizeof output_verbose ); //该函数完成数据的发送任务
}
else //按照上面的格式对号入座,好像对不上呀,这里只有3个待定的X,但要传送的变量却有好多位呢!求解···
{
char output_short[] = {"\r\n$ADDR,-XX.XC,V.C,RSI,N#"};
output_short[19] = rssi[2];
output_short[20] = rssi[1];
output_short[21] = rssi[0];
output_short[8] = temp_string[0];
output_short[9] = temp_string[1];
output_short[10] = temp_string[2];
output_short[11] = temp_string[3];
output_short[12] = temp_string[4];
output_short[13] = temp_string[5];
output_short[15] = '0'+(msg[2]/10)%10;
output_short[17] = '0'+(msg[2]%10);
output_short[3] = addr[0];
output_short[4] = addr[1];
output_short[5] = addr[2];
output_short[6] = addr[3];
TXString(output_short, sizeof output_short );
}
}
/*------------------------------------------------------------------------------
*
------------------------------------------------------------------------------*/
void TXString( char* string, int length ) //如前所述,这个函数才真正完成了发送任务
{
int pointer;
for( pointer = 0; pointer < length; pointer++)
{
volatile int i; //这里定义这个变量起什么作用?
UCA0TXBUF = string[pointer];
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?IFG2:中断标志2;#define UCA0TXIFG (0x02)
}
}
[
本帖最后由 wwh19910609 于 2011-6-12 22:25 编辑 ]