0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【躍昉科技BF2開發(fā)板試用體驗(yàn)】躍昉BF2物聯(lián)網(wǎng)開發(fā)板試用體驗(yàn)

開發(fā)板試用精選 ? 來源:開發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-11-09 16:12 ? 次閱讀

本文來源電子發(fā)燒友社區(qū),作者:Aivisus, 帖子地址:https://bbs.elecfans.com/jishu_2293431_1_1.html

通過電子發(fā)燒友論壇的試用申請(qǐng),拿到了這款躍昉BF2物聯(lián)網(wǎng)開發(fā)模塊,模塊比預(yù)想的要小很多,尺寸在一寸多點(diǎn)。但別看他小,它可是五臟俱全。把它與 IV18 熒光管放一起對(duì)比一下,就看出來了,它的體積是非常迷你的了。

官方對(duì)BF2的模塊介紹是這樣的,BF2開發(fā)板包含以下組件:LF-WM03模塊、I/O口、JP短接口、State led狀態(tài)指示燈、Power led電源指示燈、RST復(fù)位按鍵、MiniUSB口、Power selected電源選擇口、四線插座、USB-to-UART橋接器、Data transfer selected傳輸選擇。主要是面向智慧能源、智慧物流、智慧城市、智慧工廠等工業(yè)物聯(lián)網(wǎng)應(yīng)用,是一款基于RISC-V架構(gòu)的邊緣智能處理器產(chǎn)品

image.png

這里介紹一下 IV18這個(gè)熒光管,IV-18(ИВ-18)熒光電數(shù)碼管,是上世紀(jì)80-90年代前蘇聯(lián)的產(chǎn)物,冷戰(zhàn)時(shí)期曾大量制造并用于軍事設(shè)備;它是一根管內(nèi)嵌入了8個(gè)7段數(shù)字,并且每個(gè)數(shù)字右下角都有小數(shù)點(diǎn),在管子的左側(cè),還有一個(gè)表示負(fù)數(shù)的短橫線,在短橫線上面還有一個(gè)較大的圓點(diǎn)符號(hào)。驅(qū)動(dòng)它的整個(gè)電路由升壓電路、MCU主控、RTC模塊、VFD驅(qū)動(dòng)、外圍及接口器件這幾部分組成。升壓電路部分使用的還是廉價(jià)并經(jīng)典的MC34063做高壓升壓,外擴(kuò)了MOS管IRLR024,升壓效率大幅提高,而且MC34063、電感、MOS管一點(diǎn)也感覺不到溫度;IV-18的推薦工作電壓為45v-70v,工作在49v的時(shí)候效果最佳。

因?yàn)镮V18熒光管模塊帶有 溫度,濕度,環(huán)境亮度的傳感器,但其不具有網(wǎng)絡(luò)功能,因此想利用 BF的物聯(lián)網(wǎng)功能,將 IV18改造成為一款物聯(lián)網(wǎng)時(shí)鐘,主要改造的目的是:

1、把IV18物聯(lián)網(wǎng)模塊的傳感數(shù)據(jù)通過物聯(lián)網(wǎng)協(xié)議傳輸?shù)轿锫?lián)網(wǎng)平臺(tái)上,以便實(shí)時(shí)記錄環(huán)境的監(jiān)測(cè)數(shù)據(jù)

2.、能夠?qū)r(shí)鐘模塊進(jìn)行自動(dòng)的校時(shí),以便讓時(shí)鐘模塊運(yùn)行更加準(zhǔn)確

這兩個(gè)模塊它們放在一起是這樣的:

image.png

根據(jù)IV18 MCU的電路圖,IV18時(shí)鐘模塊使用的是STC12C56的8位單片機(jī)驅(qū)動(dòng),C51的代碼開發(fā)。這里通過串口連接兩個(gè)模塊,達(dá)到數(shù)據(jù)雙向通訊和控制的目的。

這里通過BF2的P12,14 的UART0 與 STC12c56的P3.1,P3.0 相連即可,需要注意的是,STC處理器的工作電壓是5V, 按理需要對(duì)STC的IO進(jìn)行分壓后,再與BF2連接,但在實(shí)際測(cè)試中,直接連接也可以工作,因此就簡(jiǎn)化處理,直接連接上了。

image.png

硬件連接很簡(jiǎn)單,硬件連接完后,主要的工作是軟件開發(fā),分別開發(fā)C51代碼與BF2模塊上的代碼。

這里把 BF2當(dāng)成STC單片機(jī)的上位機(jī)即可,完成數(shù)據(jù)收發(fā)與命令的接收控制邏輯。

C51的開發(fā)比較簡(jiǎn)單,不多說,主要的代碼如下:

/**
**  I/O接口定義
**/
sbit	SCL			=	P2^7;		//DS3231數(shù)據(jù)接口
sbit	SDA			=	P2^6;		//DS3231數(shù)據(jù)接口
/**
** 	DS3231常數(shù)定義
**/
#define DS3231_WriteAddress 0xD0    //器件寫地址
#define DS3231_ReadAddress  0xD1    //器件讀地址
#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //時(shí)
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年
//1
#define DS3231_ALARM1SECOND 0x07    //秒
#define DS3231_ALARM1MINUTE 0x08    //分
#define DS3231_ALARM1HOUR   0x09    //時(shí)
#define DS3231_ALARM1WEEK   0x0A    //星期/日
//2
#define DS3231_ALARM2MINUTE 0x0b    //分
#define DS3231_ALARM2HOUR   0x0c    //時(shí)
#define DS3231_ALARM2WEEK   0x0d    //星期/日
#define DS3231_CONTROL      0x0e    //控制寄存器
#define DS3231_STATUS       0x0f    //狀態(tài)寄存器
#define BSY                 2       //忙
#define OSF                 7       
#define DS3231_XTAL         0x10    
#define DS3231_TEMPERATUREH 0x11    
#define DS3231_TEMPERATUREL 0x12    
i=17;
for(;i>0;i--)
{
DIN = Tmp&0x0001;	 *nop* ();
CLK = 1;			 *nop* ();
CLK = 0;			 *nop* ();
Tmp>>=1;
}
LOAD	=	1;	 *nop* ();
LOAD	=	0;	 *nop* ();
/**
** 	函數(shù)名稱:			void	TimerInit()
**	功能描述:			定時(shí)器初始化
**	創(chuàng)建時(shí)間:			15:39
**	版    本:			v1.0.0
**/
void	TimerInit()
{
AUXR	=	0xC0;			//Timer0 12T Timer1 1T
TMOD	=	0x11;			//Set Timer0 & Timer1 as mode1(16bit)
TL1		=	T1MS;			//Initial timer1 low byte
TH1		=	T1MS>>8;		//Initial timer1 high byte
TR1		=	1;				//Timer1 start running
TL0		=	T125US;			//Initial timer0 low byte
TH0		=	T125US>>8;		//Initial timer0 high byte
TR0		=	1;				//Timer0 start running
}
/**
** 	函數(shù)名稱:			void	Timer0Interrupt() interrupt 1
**	功能描述:			定時(shí)器0中斷函數(shù)
**	創(chuàng)建時(shí)間:			15:39
**	版    本:			v1.0.0
**/
void	Timer0Interrupt() interrupt 1
{
TL0		=	T125US;			//Reload timer0 low byte
TH0		=	T125US>>8;		//Reload timer0 high byte
IR_RX();
//*******************************
//冒號(hào)閃爍PWM
if(DOTpwmloop<31)		DOTpwmloop++;	else	DOTpwmloop=0;
if(DOTpwmloop<=DOTcut)	DOTS=!DOTonoff;	else	DOTS=DOTonoff;
}
/**
** 	函數(shù)名稱:			void	Timer1Interrupt() interrupt 3
**	功能描述:			定時(shí)器1中斷函數(shù)
**	創(chuàng)建時(shí)間:			15:39
**	版    本:			v1.0.0
**/
void	Timer1Interrupt() interrupt 3
{
TL1		=	T1MS;			//Reload timer1 low byte
TH1		=	T1MS>>8;		//Reload timer1 high byte
if(RGBloop<1024)	RGBloop++;
if(DOTloopelse{DOTloop=0;if(DOTcut<31)	DOTcut++;}
if(NUMloopelse{NUMloop=0;if(NUMcut<20)	NUMcut++;}
if(NUMmode==1)
{
	if(NUM500msloop<1000)		NUM500msloop++;
	if(NUM500msloop==300)		NUMcut=0;
}
F_50ms_Loop++;
F_100ms_Loop++;
F_250ms_Loop++;
F_500ms_Loop++;
F_1s_Loop++;
F_2s_Loop++;
if(F_50ms_Loop	>=50)	{F_50ms		=	1;	F_50ms_Loop			=	0;}
if(F_100ms_Loop	>=100)	{F_100ms	=	1;	F_100ms_Loop		=	0;}
if(F_250ms_Loop	>=250)	{F_250ms	=	1;	F_250ms_Loop		=	0;}
if(F_500ms_Loop	>=500)	{F_500ms	=	1;	F_500ms_Loop		=	0;}
if(F_1s_Loop	>=1000)	{F_1s		=	1;	F_1s_Loop			=	0;}
if(F_2s_Loop	>=2000)	{F_2s		=	1;	F_2s_Loop			=	0;}
}
/**
** 	函數(shù)名稱:			void	Beep(uchar AT)
**	功能描述:
**	創(chuàng)建時(shí)間:			01 23:09
**	版    本:			v1.0.0
**/
void	Beep(uchar AT)
{
ulong i,j;
uchar D=35,E=32,Y=3;
switch(AT)
{
case BEEPPOWERON:	 			//正常開機(jī)		·
j=0;while(j<400){SPK=!SPK;for(i=0;ibreak;
case BEEPSHUTDOWN:				//正常關(guān)機(jī)
j=0;while(j<1800){SPK=!SPK;for(i=0;ifor(i=0;i<15;i++)DelayMS(Y);
j=0;while(j<400){SPK=!SPK;for(i=0;ifor(i=0;i<15;i++)DelayMS(Y);
j=0;while(j<400){SPK=!SPK;for(i=0;ibreak;
case BEEPERROR:					//錯(cuò)誤		····
j=0;while(j<400){SPK=!SPK;for(i=0;ifor(i=0;i<15;i++)DelayMS(Y);
j=0;while(j<400){SPK=!SPK;for(i=0;ifor(i=0;i<15;i++)DelayMS(Y);
j=0;while(j<400){SPK=!SPK;for(i=0;ifor(i=0;i<15;i++)DelayMS(Y);
j=0;while(j<400){SPK=!SPK;for(i=0;ibreak;
case BEEPCONFIRM:				//確認(rèn)
j=0;while(j<2800){SPK=!SPK;for(i=0;ibreak;
case BEEPOPERATE:				//正常操作		·
j=0;while(j<400){SPK=!SPK;for(i=0;ibreak;
}
SPK=0;
}
/**
** 	函數(shù)名稱:			void	RGB1s()
**	功能描述:			變換一次模式
**	創(chuàng)建時(shí)間:			16:29
**	版    本:			v1.0.0
**/
void	RGB1s()
{
RGBloop	=	0;
if(RGBlastcolor<13)	RGBlastcolor++;else	 RGBlastcolor=0;
}
/**
** 	函數(shù)名稱:			void	RGBFlash(uchar M)
**	功能描述:			LED閃爍
**	入口參數(shù):			M:	模式
**	創(chuàng)建時(shí)間:			16:29
**	版    本:			v1.0.0
**/
void	RGBFlash(uchar M)
{
if((RGBloop/RGBLOOPCOUNT)==RGBlaststate)	return;
RGBlaststate=(RGBloop/RGBLOOPCOUNT);
switch(M)
{
	case	RGBMOFF:
		RGBr	=	0;
		RGBg	=	0;
		RGBb	=	0;
		break;
	case	RGBMR:
		if(RGBlastcolor%2)
		{
			if(RGBrif(RGBg>0)	RGBg--;
			if(RGBb>0)	RGBb--;
		}
		else
			{if(RGBr>0)	RGBr--;	if(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;		}
		break;
	case	RGBMRG:
		if(RGBlastcolor%2)
		{
			if(RGBrif(RGBgif(RGBb>0)	RGBb--;
		}
		else
			{if(RGBr>0)	RGBr--;	if(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;		}
		break;
	case	RGBMG:
		if(RGBlastcolor%2)
		{
			if(RGBr>0)	RGBr--;
			if(RGBgif(RGBb>0)	RGBb--;
		}
		else
			{if(RGBr>0)	RGBr--;	if(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;		}
		break;
	case	RGBMGB:
		if(RGBlastcolor%2)
		{
			if(RGBr>0)	RGBr--;
			if(RGBgif(RGBbelse
			{if(RGBr>0)	RGBr--;	if(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;		}
		break;
	case	RGBMB:
		if(RGBlastcolor%2)
		{
			if(RGBr>0)	RGBr--;
			if(RGBg>0)	RGBg--;
			if(RGBbelse
			{if(RGBr>0)	RGBr--;	if(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;		}
		break;
	case	RGBMRB:
		if(RGBlastcolor%2)
		{
			if(RGBrif(RGBg>0)	RGBg--;
			if(RGBbelse
			{if(RGBr>0)	RGBr--;	if(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;		}
		break;
	case	RGBMRGB:
		if(RGBlastcolor%2)
		{
			if(RGBrif(RGBgif(RGBbelse
			{if(RGBr>0)	RGBr--;	if(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;		}
		break;
	case	RGBMFADE:
		if(RGBlastcolor==0)			//
			{if(RGBrif(RGBgif(RGBbelse if(RGBlastcolor==2)	//
			{if(RGBrif(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;	}
		else if(RGBlastcolor==4)	//綠
			{if(RGBrif(RGBgif(RGBb>0)	RGBb--;	}
		else if(RGBlastcolor==6)	//
			{if(RGBr>0)		RGBr--;	if(RGBgif(RGBb>0)	RGBb--;	}
		else if(RGBlastcolor==8)	//藍(lán)
			{if(RGBr>0)		RGBr--;	if(RGBgif(RGBbelse if(RGBlastcolor==10)	//
			{if(RGBr>0)		RGBr--;	if(RGBg>0)	RGBg--;	if(RGBbelse if(RGBlastcolor==12)	//紅
			{if(RGBrif(RGBg>0)	RGBg--;	if(RGBbelse
			{if(RGBr>0)	RGBr--;	if(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;		}
		break;
	case	RGBMFADEC:
		if(RGBlastcolor%7==0)			//
			{if(RGBrif(RGBgif(RGBbelse if(RGBlastcolor%7==1)	//
			{if(RGBrif(RGBg>0)	RGBg--;	if(RGBb>0)	RGBb--;	}
		else if(RGBlastcolor%7==2)	//綠
			{if(RGBrif(RGBgif(RGBb>0)	RGBb--;	}
		else if(RGBlastcolor%7==3)	//
			{if(RGBr>0)		RGBr--;	if(RGBgif(RGBb>0)	RGBb--;	}
		else if(RGBlastcolor%7==4)	//藍(lán)
			{if(RGBr>0)		RGBr--;	if(RGBgif(RGBbelse if(RGBlastcolor%7==5)	//
			{if(RGBr>0)		RGBr--;	if(RGBg>0)	RGBg--;	if(RGBbelse if(RGBlastcolor%7==6)	//紅
			{if(RGBrif(RGBg>0)	RGBg--;	if(RGBbbreak;
}
LEDSendData(RGBr,RGBg,RGBb);
}
/**
** 	函數(shù)名稱:			void	DOT1s()
**	功能描述:			DOT變換一次模式
**	創(chuàng)建時(shí)間:			03 17:33
**	版    本:			v1.0.0
**/
void	DOT1s()
{
DOTcut	=	0;
DOTonoff=!DOTonoff;
}
/**
** 	函數(shù)名稱:			void	NUM1s()
**	功能描述:			NUM變換一次模式
**	創(chuàng)建時(shí)間:			05 15:52
**	版    本:			v1.0.0
**/
void	NUM1s()
{
NUM500msloop=	0;
NUMcut		=	0;
}
/**
** 	函數(shù)名稱:			bit	CheckTime(bit DT)
**	功能描述:			日期時(shí)間格式檢測(cè)
**	出口參數(shù):			0:檢查日期格式	1:檢查時(shí)間格式
**	出口參數(shù):			0:有誤	1:格式正確
**	創(chuàng)建時(shí)間:			01-29 21:25
**	版    本:			v1.0.0
**/
bit	CheckTime(bit DT)
{
xdata uchar Mo,Da,Ho,Mi,Se;
xdata uint Ye;
bit Ok=1;
Ye=S_YEAR;
Mo=S_MONTH;
Da=S_DAY;
Ho=S_HOUR;
Mi=S_MINUTE;
Se=S_SECOND;
if(DT==0)
{
	if(Ye>99)			return 0;
	if((Mo>12)||(Mo<1))	return 0;
	if(Da<1)			return 0;
	switch(Mo)
	{
		case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(Da>31)return 0;break;
		case 4:case 6:case 9:case 11:if(Da>30)return 0;break;
		case 2:
			if((Ye%4==0)&&(Ye!=0))
			{if(Da>29)return 0;}
			else
			{if(Da>28)return 0;}
	}
}
else
{
	if(Ho>23) return 0;
	if(Mi>59) return 0;
	if(Se>59) return 0;
}
return	1;
}
/**
** 	函數(shù)名稱:			void	Num_Process(uchar N)
**	功能描述:			處理函數(shù)
**	創(chuàng)建時(shí)間:			04 16:11
**	版    本:			v1.0.0
**/
void	Num_Process(uchar N)
{
switch(NOWSTATE)
{
case	S_SETYEAR:						//年
Beep(BEEPOPERATE);
S_YEAR	=	(S_YEAR*10+N)%100;
break;
case	S_SETMONTH:						//月
Beep(BEEPOPERATE);
S_MONTH	=	(S_MONTH*10+N)%100;
break;
case	S_SETDAY:						//日
Beep(BEEPOPERATE);
S_DAY	=	(S_DAY*10+N)%100;
break;
case	S_SETHOUR:						//時(shí)
Beep(BEEPOPERATE);
S_HOUR	=	(S_HOUR*10+N)%100;
break;
case	S_SETMINUTE:					//分
Beep(BEEPOPERATE);
S_MINUTE=	(S_MINUTE*10+N)%100;
break;
case	S_SETSECOND:					//秒
Beep(BEEPOPERATE);
S_SECOND=	(S_SECOND*10+N)%100;
break;
case	S_NORMAL:
case	S_POWEROFF:
if(N>0 && N<10)
{
Beep(BEEPOPERATE);
RGBmode	=	N;
}
break;
case	S_SETA1M:						//1分鐘
case	S_SETA2M:						//2分鐘
Beep(BEEPOPERATE);
S_MINUTE=	(S_MINUTE*10+N)%100;
break;
case	S_SETA1H:						//1小時(shí)
case	S_SETA2H:						//2小時(shí)
Beep(BEEPOPERATE);
S_HOUR=	(S_HOUR*10+N)%100;
break;
}
}
/**
** 	函數(shù)名稱:			void	IR_Process(uchar IrData)
**	功能描述:
**	創(chuàng)建時(shí)間:			04 16:06
**	版    本:			v1.0.0
**/
void	IR_Process(uchar IrData)
{
uchar	i;
uint	j;
if(F_Alarm)
{
	Beep(BEEPCONFIRM);
	AlarmReset();
	F_Alarm	=	0;
	return;
}
switch(IrData)
{
	//**
	case	0x45:
		if(NOWSTATE==S_POWEROFF)
		{
			Beep(BEEPPOWERON);
			DelayMS(200);
			LASTN[0]=	' ';
			LASTN[1]=	' ';
			LASTN[2]=	' ';
			LASTN[3]=	' ';
			LASTN[4]=	' ';
			LASTN[5]=	' ';
			NUM1s();
			NOWSTATE	=	S_NORMAL;
			POWERON		=	0;
		}
		else
		{
			NOWSTATE	=	S_POWEROFF;
			Beep(BEEPSHUTDOWN);
			for(i=0;i<6;i++){LASTN[i]=Num[i];Num[i]=' ';}
			DOTonoff	=	0;
			DOT1s();
			NUM1s();
		}
		break;
	//**
	case	0x46:	 							//LIGHT
		if(NOWSTATE==S_NORMAL || NOWSTATE==S_POWEROFF)
		{
			Beep(BEEPOPERATE);
			if(RGBmode)
			{
				RGBmodesave	=	RGBmode;
				RGBmode		=	RGBMOFF;
			}
			else
				RGBmode		=	RGBmodesave;
		}
		break;
	//**
	case	0x47:
		if(NOWSTATE==S_NORMAL)
		{
			Beep(BEEPPOWERON);
			DOTonoff	=	1;
			DOT1s();
			S_YEAR	=	YEAR;
			S_MONTH	=	MONTH;
			S_DAY	=	DAY;
			S_HOUR	=	HOUR;
			S_MINUTE=	MINUTE;
			S_SECOND=	SECOND;
			NUMLOOPCOUNT=	5;
			RGBmodeold	=	RGBmode;
			RGBmode		=	RGBMR;
			RGBlastcolor=	0;
			RGB1s();
			NOWSTATE=	S_SETSECOND;
		}
		else if(NOWSTATE==S_SHOWDATE)
		{
			Beep(BEEPPOWERON);
			DOTonoff	=	0;
			DOT1s();
			S_YEAR	=	YEAR;
			S_MONTH	=	MONTH;
			S_DAY	=	DAY;
			S_HOUR	=	HOUR;
			S_MINUTE=	MINUTE;
			S_SECOND=	SECOND;
			NUMLOOPCOUNT=	5;
			RGBmodeold	=	RGBmode;
			RGBmode		=	RGBMG;
			RGBlastcolor=	0;
			RGB1s();
			NOWSTATE=	S_SETDAY;
		}
		else if(NOWSTATE==S_SHOWA1)
		{
			Beep(BEEPPOWERON);
			S_SECOND=	A1ONOFF;
			S_HOUR	=	A1H;
			S_MINUTE=	A1M;
			NUMLOOPCOUNT=	5;
			RGBmodeold	=	RGBmode;
			RGBmode		=	RGBMB;
			RGBlastcolor=	0;
			RGB1s();
			NOWSTATE=	S_SETA1M;
		}
		else if(NOWSTATE==S_SHOWA2)
		{
			Beep(BEEPPOWERON);
			S_SECOND=	A2ONOFF;
			S_HOUR	=	A2H;
			S_MINUTE=	A2M;
			NUMLOOPCOUNT=	5;
			RGBmodeold	=	RGBmode;
			RGBmode		=	RGBMB;
			RGBlastcolor=	0;
			RGB1s();
			NOWSTATE=	S_SETA2M;
		}
		else if(NOWSTATE==S_SETYEAR || NOWSTATE==S_SETMONTH || NOWSTATE==S_SETDAY || NOWSTATE==S_SETHOUR || NOWSTATE==S_SETMINUTE || NOWSTATE==S_SETSECOND || NOWSTATE==S_SETA1H || NOWSTATE==S_SETA1M || NOWSTATE==S_SETA2H || NOWSTATE==S_SETA2M)	//如果在調(diào)整時(shí)間日期狀態(tài)下
		{
			Beep(BEEPERROR);
			DelayMS(200);
			NUMLOOPCOUNT=	25;
			RGBmode		=	RGBmodeold;
			RGB1s();
			NOWSTATE	=	S_NORMAL;
		}
		break;
	//**
	case	0x44:	 							//DATE
		if(NOWSTATE==S_NORMAL || NOWSTATE==S_SHOWMOONDATE || NOWSTATE==S_SHOWTEMP || NOWSTATE==S_SHOWA1 || NOWSTATE==S_SHOWA2)
		{
			Beep(BEEPOPERATE);
			Num[0]	=	'0'+(FormatDate?MONTH:YEAR)/10;
			Num[1]	=	'0'+(FormatDate?MONTH:YEAR)%10;
			Num[2]	=	'0'+(FormatDate?DAY:MONTH)/10;
			Num[3]	=	'0'+(FormatDate?DAY:MONTH)%10;
			Num[4]	=	'0'+(FormatDate?YEAR:DAY)/10;
			Num[5]	=	'0'+(FormatDate?YEAR:DAY)%10;
			DOTonoff	=	0;
			DOT1s();
			NOWSTATE	=	S_SHOWDATE;
			ShowDateLoop=	0;
		}
		else if(NOWSTATE==S_SHOWDATE)
		{
		  	Conversion(0,(YEAR/10)*16+YEAR%10,(MONTH/10)*16+MONTH%10,(DAY/10)*16+DAY%10);
			Beep(BEEPOPERATE);
			Num[0]	=	'0'+(FormatDate?month_moon:year_moon)/16;
			Num[1]	=	'0'+(FormatDate?month_moon:year_moon)%16;
			Num[2]	=	'0'+(FormatDate?day_moon:month_moon)/16;
			Num[3]	=	'0'+(FormatDate?day_moon:month_moon)%16;
			Num[4]	=	'0'+(FormatDate?year_moon:day_moon)/16;
			Num[5]	=	'0'+(FormatDate?year_moon:day_moon)%16;
			DOTonoff	=	1;
			DOT1s();
			NOWSTATE	=	S_SHOWMOONDATE;
			ShowDateLoop=	0;
		}
		break;
	//**
	case	0x40:	 							//ALARM
		if(NOWSTATE==S_NORMAL || NOWSTATE==S_SHOWMOONDATE || NOWSTATE==S_SHOWDATE || NOWSTATE==S_SHOWTEMP || NOWSTATE==S_SHOWA2)
		{
			Beep(BEEPOPERATE);
			Num[0]	=	'a';
			Num[1]	=	'1';
			Num[2]	=	(A1ONOFF?'0'+A1H/10:' ');
			Num[3]	=	(A1ONOFF?'0'+A1H%10:'0');
			Num[4]	=	(A1ONOFF?'0'+A1M/10:'f');
			Num[5]	=	(A1ONOFF?'0'+A1M%10:'f');
			DOTonoff	=	1;
			DOT1s();
			NOWSTATE	=	S_SHOWA1;
			ShowDateLoop=	0;
		}
		else if(NOWSTATE==S_SHOWA1)
		{
			Beep(BEEPOPERATE);
			Num[0]	=	'a';
			Num[1]	=	'2';
			Num[2]	=	(A2ONOFF?'0'+A2H/10:' ');
			Num[3]	=	(A2ONOFF?'0'+A2H%10:'0');
			Num[4]	=	(A2ONOFF?'0'+A2M/10:'f');
			Num[5]	=	(A2ONOFF?'0'+A2M%10:'f');
			DOTonoff	=	1;
			DOT1s();
			NOWSTATE	=	S_SHOWA2;
			ShowDateLoop=	0;
		}
		break;
	//**
	case	0x43:	 							//TEMP
		if(NOWSTATE==S_NORMAL || NOWSTATE==S_SHOWMOONDATE || NOWSTATE==S_SHOWDATE || NOWSTATE==S_SHOWA1 || NOWSTATE==S_SHOWA2)
		{
			Beep(BEEPPOWERON);
			for(i=1;i<20;i++)
			{
				j=GetTemp();
				if(j>60)	DelayMS(50);
				else i=20;
			}
			if(FormatTemp)	j=32+j*1.8;
			Num[0]	=	' ';
			Num[1]	=	((j>99)?'0'+(j%1000)/100:' ');
			Num[2]	=	((j>9)?'0'+(j%100)/10:' ');
			Num[3]	=	j%10+'0';
			Num[4]	=	' ';
			Num[5]	=	(FormatTemp?'f':'c');
			DOTonoff	=	0;
			DOT1s();
			NOWSTATE	=	S_SHOWTEMP;
			ShowDateLoop=	0;
		}
		break;
	//**
	case	0x07:	 							//LEFT
		if(NOWSTATE==S_NORMAL || NOWSTATE==S_POWEROFF)
		{
			if(RGBbright>=10)
			{
				RGBbright-=7;
				RGBr=0;RGBg=0;RGBb=0;
				Beep(BEEPOPERATE);
			}
		}
		else if(NOWSTATE==S_SETSECOND)	{NOWSTATE=S_SETMINUTE;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETMINUTE)	{NOWSTATE=S_SETHOUR;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETHOUR)	{NOWSTATE=S_SETSECOND;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETYEAR)	{NOWSTATE=S_SETDAY;		Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETDAY)		{NOWSTATE=S_SETMONTH;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETMONTH)	{NOWSTATE=S_SETYEAR;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETA1M)		{NOWSTATE=S_SETA1H;		Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETA1H)		{NOWSTATE=S_SETA1M;		Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETA2M)		{NOWSTATE=S_SETA2H;		Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETA2H)		{NOWSTATE=S_SETA2M;		Beep(BEEPOPERATE);}
		break;
	//**
	case	0x15:	 							//RIGHT
		if(NOWSTATE==S_NORMAL || NOWSTATE==S_POWEROFF)
		{
			if(RGBbright<=24)
			{
				RGBbright+=7;
				RGBr=0;RGBg=0;RGBb=0;
				Beep(BEEPOPERATE);
			}
		}
		else if(NOWSTATE==S_SETSECOND)	{NOWSTATE=S_SETHOUR;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETHOUR)	{NOWSTATE=S_SETMINUTE;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETMINUTE)	{NOWSTATE=S_SETSECOND;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETYEAR)	{NOWSTATE=S_SETMONTH;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETMONTH)	{NOWSTATE=S_SETDAY;		Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETDAY)		{NOWSTATE=S_SETYEAR;	Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETA1M)		{NOWSTATE=S_SETA1H;		Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETA1H)		{NOWSTATE=S_SETA1M;		Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETA2M)		{NOWSTATE=S_SETA2H;		Beep(BEEPOPERATE);}
		else if(NOWSTATE==S_SETA2H)		{NOWSTATE=S_SETA2M;		Beep(BEEPOPERATE);}
		break;
	//**
	case	0x09:	 							//FUNC
		if(NOWSTATE==S_NORMAL)
		{
			Beep(BEEPPOWERON);
			if(NUMmode<2)NUMmode++;else NUMmode=0;//NUMmode切換
			if(NUMmode==1)NUMLOOPCOUNT=15;else NUMLOOPCOUNT=25;	//調(diào)整各模式的顏色漸變STEP毫秒數(shù)
		}
		else if(NOWSTATE==S_SETA1H || NOWSTATE==S_SETA1M || NOWSTATE==S_SETA2H || NOWSTATE==S_SETA2M)
		{
			Beep(BEEPPOWERON);
			if(S_SECOND)S_SECOND=0;else S_SECOND=1;
		}
		else if(NOWSTATE==S_SHOWTEMP)			//顯示溫度狀態(tài)
		{
			Beep(BEEPPOWERON);
			if(FormatTemp)FormatTemp=0;else FormatTemp=1;
			FormatSave();
			for(i=1;i<20;i++)
			{
				j=GetTemp();
				if(j>60)	DelayMS(50);
				else i=20;
			}
			if(FormatTemp)	j=32+j*1.8;			//℉
			Num[0]	=	' ';
			Num[1]	=	((j>99)?'0'+(j%1000)/100:' ');
			Num[2]	=	((j>9)?'0'+(j%100)/10:' ');
			Num[3]	=	j%10+'0';
			Num[4]	=	' ';
			Num[5]	=	(FormatTemp?'f':'c');
			DOTonoff	=	0;
			DOT1s();
			NUM1s();
			NOWSTATE	=	S_SHOWTEMP;
			ShowDateLoop=	0;
		}
		else if(NOWSTATE==S_SHOWDATE)
	   	{
			Beep(BEEPOPERATE);
			if(FormatDate)FormatDate=0;else FormatDate=1;
			FormatSave();
			Num[0]	=	'0'+(FormatDate?MONTH:YEAR)/10;
			Num[1]	=	'0'+(FormatDate?MONTH:YEAR)%10;
			Num[2]	=	'0'+(FormatDate?DAY:MONTH)/10;
			Num[3]	=	'0'+(FormatDate?DAY:MONTH)%10;
			Num[4]	=	'0'+(FormatDate?YEAR:DAY)/10;
			Num[5]	=	'0'+(FormatDate?YEAR:DAY)%10;
			DOTonoff	=	0;
			DOT1s();
			NOWSTATE	=	S_SHOWDATE;
			ShowDateLoop=	0;
		}
		else if(NOWSTATE==S_SHOWMOONDATE)
		{
		  	Conversion(0,(YEAR/10)*16+YEAR%10,(MONTH/10)*16+MONTH%10,(DAY/10)*16+DAY%10);
			if(FormatDate)FormatDate=0;else FormatDate=1;
			FormatSave();
			Beep(BEEPOPERATE);
			Num[0]	=	'0'+(FormatDate?month_moon:year_moon)/16;
			Num[1]	=	'0'+(FormatDate?month_moon:year_moon)%16;
			Num[2]	=	'0'+(FormatDate?day_moon:month_moon)/16;
			Num[3]	=	'0'+(FormatDate?day_moon:month_moon)%16;
			Num[4]	=	'0'+(FormatDate?year_moon:day_moon)/16;
			Num[5]	=	'0'+(FormatDate?year_moon:day_moon)%16;
			DOTonoff	=	1;
			DOT1s();
			NOWSTATE	=	S_SHOWMOONDATE;
			ShowDateLoop=	0;
		}
		else if(NOWSTATE==S_SHOWA1)
		{
			Beep(BEEPOPERATE);
			if(A1ONOFF)A1ONOFF=0;else A1ONOFF=1;
			AlarmSave(1,A1H,A1M,A1ONOFF);
			Num[0]	=	'a';
			Num[1]	=	'1';
			Num[2]	=	(A1ONOFF?'0'+A1H/10:' ');
			Num[3]	=	(A1ONOFF?'0'+A1H%10:'0');
			Num[4]	=	(A1ONOFF?'0'+A1M/10:'f');
			Num[5]	=	(A1ONOFF?'0'+A1M%10:'f');
			DOTonoff	=	1;
			DOT1s();
			NOWSTATE	=	S_SHOWA1;
			ShowDateLoop=	0;
		}
		else if(NOWSTATE==S_SHOWA2)
		{
			Beep(BEEPOPERATE);
			if(A2ONOFF)A2ONOFF=0;else A2ONOFF=1;
			AlarmSave(2,A2H,A2M,A2ONOFF);
			Num[0]	=	'a';
			Num[1]	=	'2';
			Num[2]	=	(A2ONOFF?'0'+A2H/10:' ');
			Num[3]	=	(A2ONOFF?'0'+A2H%10:'0');
			Num[4]	=	(A2ONOFF?'0'+A2M/10:'f');
			Num[5]	=	(A2ONOFF?'0'+A2M%10:'f');
			DOTonoff	=	1;
			DOT1s();
			NUM1s();
			NOWSTATE	=	S_SHOWA2;
			ShowDateLoop=	0;
		}
		break;
	//**
	case	0x16:
		if(NOWSTATE==S_NORMAL)
		{
			Beep(BEEPOPERATE);
			if(FormatTime)FormatTime=0;else FormatTime=1;
			FormatSave();
			Num[0]	=	(FormatTime?'1':'2');
			Num[1]	=	(FormatTime?'2':'4');
			Num[2]	=	'h';
			Num[3]	=	' ';
			Num[4]	=	' ';
			Num[5]	=	' ';
			DOTonoff	=	0;
			DOT1s();
			NUM1s();
			NOWSTATE	=	S_SHOWTEMP;
			ShowDateLoop=	0;
		}
		if(NOWSTATE==S_SETHOUR || NOWSTATE==S_SETMINUTE || NOWSTATE==S_SETSECOND)
		{
			GetDateTime();
			S_YEAR	=	YEAR;
			S_MONTH	=	MONTH;
			S_DAY	=	DAY;
			if(CheckTime(1))
			{
				ModifyTime(S_YEAR,S_MONTH,S_DAY,S_HOUR,S_MINUTE,S_SECOND);
				Beep(BEEPCONFIRM);
			}
			else
			{
				Beep(BEEPERROR);
			}
			DelayMS(200);
			NUMLOOPCOUNT=	25;
			RGBmode		=	RGBmodeold;
			NOWSTATE	=	S_NORMAL;
		}
		if(NOWSTATE==S_SETYEAR || NOWSTATE==S_SETMONTH || NOWSTATE==S_SETDAY)
		{
			GetDateTime();
			S_HOUR		=	HOUR;
			S_MINUTE	=	MINUTE;
			S_SECOND	=	SECOND;
			if(CheckTime(0))
			{
				ModifyTime(S_YEAR,S_MONTH,S_DAY,S_HOUR,S_MINUTE,S_SECOND);
				Beep(BEEPCONFIRM);
			}
			else
			{
				Beep(BEEPERROR);
			}
			DelayMS(200);
			NUMLOOPCOUNT=	25;
			RGBmode		=	RGBmodeold;
			RGB1s();
			NOWSTATE	=	S_NORMAL;
		}
		if(NOWSTATE==S_SETA1H || NOWSTATE==S_SETA1M || NOWSTATE==S_SETA2H || NOWSTATE==S_SETA2M)
		{
			if(CheckTime(1))
			{
				if(NOWSTATE==S_SETA1H || NOWSTATE==S_SETA1M)		AlarmSave(1,S_HOUR,S_MINUTE,S_SECOND);
				else if(NOWSTATE==S_SETA2H || NOWSTATE==S_SETA2M)	AlarmSave(2,S_HOUR,S_MINUTE,S_SECOND);
				Beep(BEEPCONFIRM);
			}
			else
			{
				Beep(BEEPERROR);
			}
			DelayMS(500);
			NUMLOOPCOUNT=	25;
			RGBmode		=	RGBmodeold;
			RGB1s();
			NOWSTATE	=	S_NORMAL;
		}
		break;
	//**
	case	0x19:
		if(NOWSTATE==S_SETYEAR || NOWSTATE==S_SETMONTH || NOWSTATE==S_SETDAY || NOWSTATE==S_SETHOUR || NOWSTATE==S_SETMINUTE || NOWSTATE==S_SETSECOND || NOWSTATE==S_SETA1H || NOWSTATE==S_SETA1M || NOWSTATE==S_SETA2H || NOWSTATE==S_SETA2M)	//如果在調(diào)整時(shí)間日期狀態(tài)下
		{
			Beep(BEEPERROR);
			DelayMS(200);
			NUMLOOPCOUNT=	25;
			RGBmode		=	RGBmodeold;
			RGB1s();
			NOWSTATE	=	S_NORMAL;
		}
		break;
	//**
	case	0x0D:	Num_Process(0); 	break;				//0
	case	0x0C:	Num_Process(1); 	break;				//1
	case	0x18:	Num_Process(2); 	break;				//2
	case	0x5E:	Num_Process(3); 	break;				//3
	case	0x08:	Num_Process(4); 	break;				//4
	case	0x1C:	Num_Process(5); 	break;				//5
	case	0x5A:	Num_Process(6); 	break;				//6
	case	0x42:	Num_Process(7); 	break;				//7
	case	0x52:	Num_Process(8); 	break;				//8
	case	0x4A:	Num_Process(9); 	break;				//9
}
}

)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>)>;i++){;}j++;};>;i++){;}j++;}>;i++){;}j++;}>;i++){;}j++;};i++){;}j++;};i++){;}j++;};i++){;}j++;}>;i++){;}j++;};i++){;}j++;};i++){;}j++;};>)>)>

BF2的開發(fā),主要按開發(fā)板所帶的開發(fā)資料來進(jìn)行,BF2開發(fā)板帶科豐富的開發(fā)資料,需要仔細(xì)的看一下,主要開發(fā)指導(dǎo)文件在,《BF2 SDK入門指南》主要介紹快速了解SDK的使用,

BF2開發(fā)資料有:

SPEC 目錄,主要是開發(fā)板,芯片規(guī)格書以及SDK 文檔資料

SDK 主要是SDK軟件,編譯工具鏈以及例程

Dev_tools 是一些下載工具

SDK里主要的內(nèi)容有:

Component: SDK提供的組件

Customer_App:SDK提供的DEMO,開發(fā)主要參考這些demo代碼來完成

Docs: 即文檔目錄,所有SDK的庫,函數(shù)的說明,以及編譯工具的配置,說明

Make_script_riscv 編譯相關(guān)腳本

Toolchain : 編譯工具鏈

tools 燒寫工具

在BF2的SDK里提供了三種平臺(tái)的開發(fā)環(huán)境,分別是 Darwin, Linux , MySYS

這里我選用的是 Linux的開發(fā)環(huán)境,搭建Linux開發(fā)環(huán)境方法如下:

1.在Linux 下建立一個(gè)主工作目錄,也可以創(chuàng)建一個(gè) DOCK,在DOCK中操作

  1. 將BF2提供的 riscv.rar 文件解壓開,把其中的 Linux 目錄復(fù)制到 Linux 下 。

3 將SDK里的 lf_iot_sdk 和 components 整個(gè)目錄復(fù)制到工作目錄下

3.配置環(huán)境變量,分別把 riscv 的SDK頭文件主目錄和連接的庫文件目錄放入環(huán)境變量中

  1. 在Linux 下執(zhí)行編譯命令,編譯一個(gè)測(cè)試文件, 測(cè)試開發(fā)環(huán)境創(chuàng)建正確,在Linux下可以看到編譯器的版本如下

image.png

建立編譯環(huán)境完成后,下一步進(jìn)行響應(yīng)的代碼的開發(fā),這次主要參考了SDK Customer_app 的三個(gè)主要DEMO工程,分別是:

sdk_app_uart_ctl

sdk_at_module

lf686_gate_demo

他們分別是串口通信功能的實(shí)現(xiàn),串口命令的的開發(fā),以及 IOT 網(wǎng)關(guān)的實(shí)現(xiàn)代碼,以便使用 MQTT 物聯(lián)網(wǎng)協(xié)議,將傳感數(shù)據(jù)傳送到案例物聯(lián)網(wǎng)平臺(tái)上。

/*
 * Copyright (c) 2020 LeapFive.
 *
 * This file is part of
 *     *** LeapFive Software Dev Kit ***
 *      (see www.leapfive.com).
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *   1. Redistributions of source code must retain the above copyright notice,
 *      this list of conditions and the following disclaimer.
 *   2. Redistributions in binary form must reproduce the above copyright notice,
 *      this list of conditions and the following disclaimer in the documentation
 *      and/or other materials provided with the distribution.
 *   3. Neither the name of LeapFive Lab nor the names of its contributors
 *      may be used to endorse or promote products derived from this software
 *      without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "demo.h"

void log_step(const char *step[2])
{
    printf("%s   %srn", step[0], step[1]);
}

void cmd_uart_flush(char *buf, int len, int argc, char **argv)
{
    int fd;
    const char *pbuf1 = "1>0123456789abcdefghijklmnopqrstuvwxyz>0123456789abcdefghijklmnopqrstuvwxyz>0123456789abcdefghijklmnopqrstuvwxyz>2";
    const char *pbuf2 = "3<0123456789abcdefghijklmnopqrstuvwxyz<0123456789abcdefghijklmnopqrstuvwxyz<0123456789abcdefghijklmnopqrstuvwxyz<4";


    fd = aos_open("/dev/ttyS1", 0);
    if (fd < 0) {
        printf("open ttyS1 errorrn");
        return;
    }
    while (1)
    {
        aos_write(fd, pbuf1, strlen(pbuf1));
        while ( 1 == UART_GetTxBusBusyStatus(1)) {
        }
        //lf_uart_flush(1);
        aos_ioctl(fd, IOCTL_UART_IOC_BAUD_MODE, 115200);
        aos_ioctl(fd, IOCTL_UART_IOC_BAUD_MODE, 4800);
        vTaskDelay(2000);
        aos_write(fd, pbuf2, strlen(pbuf2));
        aos_ioctl(fd, IOCTL_UART_IOC_BAUD_MODE, 115200);
        aos_ioctl(fd, IOCTL_UART_IOC_BAUD_MODE, 4800);
        vTaskDelay(2000);
   }
}

void bluart_block_entry(void *arg)
{
    int length;
    uint8_t buf_recv[50];
    const char *name = arg;
    uint32_t count = 0;

    int fd = aos_open(name, 0);
    aos_ioctl(fd, IOCTL_UART_IOC_BAUD_MODE, 115200);
    aos_ioctl(fd, IOCTL_UART_IOC_READ_BLOCK, 0);

    log_info("%s-> fd = %drn", name, fd);

    while (1) {
        length = aos_read(fd, buf_recv, sizeof(buf_recv));
        if (length > 0) {
            log_info("%s name.length = %d:rn", name, length);
            aos_write(fd, buf_recv, length);
        }
        vTaskDelay(500);
        log_info("test.rn");
        count++;

        if (count == 5) {
            log_info("set noblock.rn");
            aos_ioctl(fd, IOCTL_UART_IOC_READ_NOBLOCK, 0);
        }

        if (count == 10) {
            log_info("set block.rn");
            aos_ioctl(fd, IOCTL_UART_IOC_READ_BLOCK, 0);
        }
    }
}

void bluart_ioctl1_entry(void *arg)
{
    int res;
    char buf_recv[16];
    const char *name = arg;
    uart_ioc_waitread_t waitr_arg;
    int fd;

    fd = aos_open(name, 0);

    log_info("%s-> fd = %drn", name, fd);

    while (1) {
        //log_info("ready to read.rn");
        waitr_arg.buf = buf_recv;
        waitr_arg.read_size = sizeof(buf_recv);
        waitr_arg.timeout = 5000;
        res = aos_ioctl(fd, IOCTL_UART_IOC_WAITRD_MODE, (unsigned long)(&waitr_arg));
        //res = aos_ioctl(fd, IOCTL_UART_IOC_WAITRDFULL_MODE, (unsigned long)(&waitr_arg));
        //res = aos_ioctl(fd, IOCTL_UART_IOC_WAITENDBYTE_MODE, (unsigned long)(&waitr_arg));
        if (res > 0) {
            log_info("%s name.length = %d:rn", name, res);
            aos_write(fd, buf_recv, res);
        }
    }
}

void bluart_ioctl2_entry(void *arg)
{
    int res;
    char buf_recv[16];
    const char *name = arg;
    uart_ioc_waitread_t waitr_arg;
    int fd;

    fd = aos_open(name, 0);

    log_info("%s-> fd = %drn", name, fd);

    while (1) {
        //log_info("ready to read.rn");
        waitr_arg.buf = buf_recv;
        waitr_arg.read_size = sizeof(buf_recv);
        waitr_arg.timeout = 0;
        res = aos_ioctl(fd, IOCTL_UART_IOC_WAITRD_MODE, (unsigned long)(&waitr_arg));
        //res = aos_ioctl(fd, IOCTL_UART_IOC_WAITRDFULL_MODE, (unsigned long)(&waitr_arg));
        if (res > 0) {
            log_info("%s name.length = %d:rn", name, res);
            aos_write(fd, buf_recv, res);
        }
    }
}

void bluart_ioctl3_entry(void *arg)
{
    int res;
    char buf_recv[16];
    const char *name = arg;
    uart_ioc_waitread_t waitr_arg;
    int fd;

    fd = aos_open(name, 0);

    log_info("%s-> fd = %drn", name, fd);

    while (1) {
        log_info("ready to read.rn");
        waitr_arg.buf = buf_recv;
        waitr_arg.read_size = sizeof(buf_recv);
        waitr_arg.timeout = AOS_WAIT_FOREVER;
        res = aos_ioctl(fd, IOCTL_UART_IOC_WAITRD_MODE, (unsigned long)(&waitr_arg));
        //res = aos_ioctl(fd, IOCTL_UART_IOC_WAITRDFULL_MODE, (unsigned long)(&waitr_arg));
        if (res > 0) {
            log_info("%s name.length = %d:rn", name, res);
            aos_write(fd, buf_recv, res);
        }
    }
}

void cmd_uart_ioctl(char *buf, int len, int argc, char **argv)
{
    if (argc != 2) {
        log_error("arg error.rn");
        return;
    }
    if (0 == memcmp(argv[1], "1", 1)) {
        aos_task_new("bluart_ioctl", bluart_ioctl1_entry, "/dev/ttyS1", 2048);
    } else if (0 == memcmp(argv[1], "2", 1)) {
        aos_task_new("bluart_ioctl", bluart_ioctl2_entry, "/dev/ttyS1", 2048);
    } else if (0 == memcmp(argv[1], "3", 1)) {
        aos_task_new("bluart_ioctl", bluart_ioctl3_entry, "/dev/ttyS1", 2048);
    }
}

void cmd_uart_block(char *buf, int len, int argc, char **argv)
{
    //aos_task_new("uart0_block", bluart_block_entry, "/dev/ttyS0", 2048);
    aos_task_new("uart1_block", bluart_block_entry, "/dev/ttyS1", 2048);
}

const static struct cli_command cmds_user[] STATIC_CLI_CMD_ATTRIBUTE = {
    { "uartflush", "uart flush", cmd_uart_flush},
    { "uartblock", "uart block", cmd_uart_block},
    { "uartioctl", "uart io control", cmd_uart_ioctl},
};

int uart_ctl_cli_init(void)
{
    // static command(s) do NOT need to call aos_cli_register_command(s) to register.
    // However, calling aos_cli_register_command(s) here is OK but is of no effect as cmds_user are included in cmds list.
    // XXX NOTE: Calling this *empty* function is necessary to make cmds_user in this file to be kept in the final link.
    //return aos_cli_register_commands(cmds_user, sizeof(cmds_user)/sizeof(cmds_user[0]));
    return 0;
}

代碼開發(fā)主要使用原始的 VI 方式進(jìn)行,如下圖:

image.png

在 阿里云物聯(lián)網(wǎng)平臺(tái)上測(cè)試接收到的MQTT消息,說明已經(jīng)能過夠收到IV18上傳的數(shù)據(jù)。

image.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 躍昉科技
    +關(guān)注

    關(guān)注

    0

    文章

    63

    瀏覽量

    1811
  • 開發(fā)板試用
    +關(guān)注

    關(guān)注

    3

    文章

    300

    瀏覽量

    1996
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    (一)、·星光2 開機(jī)試用

    星光2
    的頭像 發(fā)表于 07-08 18:21 ?367次閱讀
    (一)、<b class='flag-5'>昉</b>·星光<b class='flag-5'>2</b>  開機(jī)<b class='flag-5'>試用</b>

    2章_開發(fā)板使用

    本課程使用 ST-Link 給開發(fā)板供電、燒錄、調(diào)試。
    的頭像 發(fā)表于 06-29 14:25 ?708次閱讀
    第<b class='flag-5'>2</b>章_<b class='flag-5'>開發(fā)板</b>使用

    點(diǎn)擊參與米爾NXP i.MX 93開發(fā)板有獎(jiǎng)試用

    米爾與NXP合作發(fā)布的新品基于NXPi.MX93應(yīng)用處理器的MYD-LMX9X開發(fā)板免費(fèi)試用活動(dòng)來啦~~米爾提供了3塊價(jià)值678元的MYD-LMX9X開發(fā)板發(fā)起試用活動(dòng)您不僅可以免費(fèi)體
    的頭像 發(fā)表于 06-13 08:02 ?276次閱讀
    點(diǎn)擊參與米爾NXP i.MX 93<b class='flag-5'>開發(fā)板</b>有獎(jiǎng)<b class='flag-5'>試用</b>

    廣東科技加入甲辰計(jì)劃

    廣東科技有限公司近日宣布加入甲辰計(jì)劃,目標(biāo)是在2036龍年之前,通過RISC-V技術(shù),實(shí)現(xiàn)信息產(chǎn)業(yè)全覆蓋。該公司計(jì)劃構(gòu)建從數(shù)據(jù)中心到桌面辦公、移動(dòng)穿戴設(shè)備乃至智能聯(lián)網(wǎng)的開放標(biāo)準(zhǔn)體
    的頭像 發(fā)表于 05-31 10:03 ?394次閱讀

    免費(fèi)!NXP i.MX 93開發(fā)板有獎(jiǎng)試用

    米爾與NXP合作發(fā)布的新品基于NXPi.MX93應(yīng)用處理器的MYD-LMX9X開發(fā)板免費(fèi)試用活動(dòng)來啦~~米爾提供了2塊價(jià)值678
    的頭像 發(fā)表于 05-23 08:01 ?496次閱讀
    免費(fèi)!NXP i.MX 93<b class='flag-5'>開發(fā)板</b>有獎(jiǎng)<b class='flag-5'>試用</b>

    ·星光 2 高性能RISC-V單板計(jì)算機(jī)試用體驗(yàn)】開箱及裝載Debian系統(tǒng)

    上周收到了·星光 2高性能RISC-V單板計(jì)算機(jī)開發(fā)板,在此非常感謝賽科技提供的試用機(jī)會(huì)。開發(fā)板
    發(fā)表于 01-24 00:32

    喜訊|銷售破200萬顆!芯片,引領(lǐng)智能科技時(shí)代

    科技單一芯片銷量已累計(jì)突破 2KK大關(guān) , 這標(biāo)志著在工業(yè)聯(lián)網(wǎng)領(lǐng)域已取得突破性進(jìn)展,展示了
    的頭像 發(fā)表于 12-15 17:35 ?515次閱讀
    喜訊|銷售破200萬顆!<b class='flag-5'>躍</b><b class='flag-5'>昉</b>芯片,引領(lǐng)智能科技時(shí)代

    動(dòng)態(tài)|科技與友達(dá)數(shù)位,數(shù)字化時(shí)代的強(qiáng)強(qiáng)聯(lián)手

    近日,廣東科技有限公司與友達(dá)數(shù)位科技服務(wù)(蘇州)有限公司(AUO Digitech,以下簡(jiǎn)稱“友達(dá)數(shù)位ADT”)正式達(dá)成戰(zhàn)略合作伙伴關(guān)系,攜手邁向數(shù)字化轉(zhuǎn)型的新時(shí)代。
    的頭像 發(fā)表于 12-07 21:30 ?552次閱讀

    明德?lián)PPCIE開發(fā)板系列XILINX-K7試用體驗(yàn)-第二篇

    本文為明德?lián)P原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處!作者:Vito 明德?lián)PPCIE開發(fā)板系列XILINX-K7試用體驗(yàn)-第二篇 第二周的試用計(jì)劃是實(shí)現(xiàn)常見低速協(xié)議(UART,I2C,SPI)的FPG
    的頭像 發(fā)表于 11-29 15:39 ?3033次閱讀
    明德?lián)PPCIE<b class='flag-5'>開發(fā)板</b>系列XILINX-K7<b class='flag-5'>試用</b>體驗(yàn)-第二篇

    RK3568開發(fā)板在工控工業(yè)聯(lián)網(wǎng)網(wǎng)關(guān)方面的應(yīng)用

    RK3568開發(fā)板在工控工業(yè)聯(lián)網(wǎng)網(wǎng)關(guān)方面的應(yīng)用
    的頭像 發(fā)表于 11-22 14:21 ?676次閱讀
    RK3568<b class='flag-5'>開發(fā)板</b>在工控工業(yè)<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>網(wǎng)關(guān)方面的應(yīng)用

    【涂鴉T2-U開發(fā)板試用體驗(yàn)】開箱測(cè)試

    -U 開發(fā)板的體積比較小巧,接口豐富,可以將傳統(tǒng)嵌入式產(chǎn)品方便地升級(jí)到智能聯(lián)網(wǎng)系統(tǒng)。涂鴉 T2-U 開發(fā)板主控采用涂鴉智能
    發(fā)表于 11-18 11:28

    【涂鴉T2-U開發(fā)板試用體驗(yàn)】初識(shí)及試玩開發(fā)板

    用,另一端是usb接口,除了用來供電,還可以當(dāng)做串口來用,今天第一個(gè)玩的就是串口了。 這塊開發(fā)板可以說是聯(lián)網(wǎng)領(lǐng)域的代表,能同時(shí)支持藍(lán)牙和wifi連接,提供了連接涂鴉云的各種例程,我相信今后一定會(huì)大火吧
    發(fā)表于 11-17 22:44

    【涂鴉T2-U開發(fā)板試用體驗(yàn)】遠(yuǎn)程調(diào)試blink

    隨著聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,智能硬件的開發(fā)變得越來越熱門。在這個(gè)領(lǐng)域,涂鴉智能是一家備受矚目的公司,其T2開發(fā)板也受到了廣泛關(guān)注。作為一名
    發(fā)表于 11-17 15:54

    動(dòng)態(tài)|簽署亞洲城市減碳卡澳門合作框架協(xié)議

    L5 科技 亞洲城市減碳卡 ?簽澳門合作框架協(xié)議 ?Summary 2023年10月20日,由澳臺(tái)商會(huì)和臺(tái)北市商業(yè)會(huì)牽頭,攜手科技、莫比綠電、綠色資源及萬博科技等公司共同推進(jìn)的
    的頭像 發(fā)表于 10-24 16:15 ?469次閱讀
    <b class='flag-5'>躍</b><b class='flag-5'>昉</b>動(dòng)態(tài)|<b class='flag-5'>躍</b><b class='flag-5'>昉</b>簽署亞洲城市減碳卡澳門合作框架協(xié)議

    【LuckFox Pico Plus開發(fā)板免費(fèi)試用】+開發(fā)板上手

    LuckFox Pico的試用機(jī)會(huì),這款開發(fā)板相當(dāng)于是RV1103的小型評(píng)估,引出了所有的IO口,并且?guī)б蕴W(wǎng)/USB/攝像頭等高速接口。下面一起來看一下。
    的頭像 發(fā)表于 10-16 00:58 ?3902次閱讀
    【LuckFox Pico Plus<b class='flag-5'>開發(fā)板</b>免費(fèi)<b class='flag-5'>試用</b>】+<b class='flag-5'>開發(fā)板</b>上手