日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] TCP/IP Stack  Microchip TCP/IP Stack是免費(fèi)的,廣泛應(yīng)用于PIC單片機(jī)中。由于有遠(yuǎn)程更新程序的需求,我決定開發(fā)基于TCP協(xié)議的ethernet bootloader, 主要使用了Microchip TCP/IP Stack的TCP模塊。最終我開發(fā)出來

 TCP/IP Stack


  Microchip TCP/IP Stack是免費(fèi)的,廣泛應(yīng)用于PIC單片機(jī)中。由于有遠(yuǎn)程更新程序的需求,我決定開發(fā)基于TCP協(xié)議的ethernet bootloader, 主要使用了Microchip TCP/IP Stack的TCP模塊。最終我開發(fā)出來的ethernet bootloader 在PIC18F97J60上驗(yàn)證通過。整個(gè)實(shí)現(xiàn)上分兩部分,一部分是單片機(jī)端的基于TCP協(xié)議的bootloader程序,我將其命名為PhnBoot_v2.0, 另外一部分是同樣基于TCP協(xié)議與單片機(jī)互動的PC端通信程序,我將其命名為PhnLoader_v2.0。我還定義了PhnBoot_v2.0和PhnLoader_v2.0之間傳輸數(shù)據(jù)的通信協(xié)定。下面將細(xì)說我是如何實(shí)現(xiàn)的。


  通信協(xié)定


  單片機(jī)端PhnBoot_v2.0和PC端PhnLoader_v2.0之間的通信數(shù)據(jù)包采用以下協(xié)定


...


  定義如下:


STX - Start of packet indicator

ETX - End of packet indicator

LEN - The length of true data

DATA - General data 16 bytes, only first LEN of datas are true

CMD - Base command

ADDR - Address up to 24 bits ( ADDRL , ADDRH , ADDRH)


  具體有以下Base command:


RD-VER: 0x00 -- Read Version Information (最終版本刪除了此命令)

RD_MEM: 0x01 -- Read Program Memory (最終版本刪除了此命令)

ER_MEM: 0x03 -- Erase Program Memory

WR_MEM: 0x02 -- Write Program Memory

WR_CFG: 0x04 -- Write Configuration Registers


  PhnLoader_v2.0 功能


  定義好了通訊協(xié)定, 接著就按照協(xié)定去實(shí)現(xiàn)PhnLoader_v2.0。 PhnLoader_v2.0的具體功能包括選擇IP地址,端口和協(xié)議類型, 目前只支持TCP協(xié)議, 創(chuàng)建TCP服務(wù)器,加載應(yīng)用程序Hex文件,Parse 應(yīng)用程序的Hex文件,一行一行解讀Hex文件,一旦收到連接請求,建立TCP連接,一旦收到應(yīng)用程序更新請求,立刻按照通訊協(xié)定采用TCP協(xié)議發(fā)送Hex記錄到單片機(jī),接收單片機(jī)發(fā)送回來的Response,發(fā)送完畢后斷開TCP連接,發(fā)送期間出現(xiàn)問題就立馬結(jié)束發(fā)送。


  PhnLoader_v2.0 主要代碼段


  PhnLoader_v2.0是用C#實(shí)現(xiàn)的,是我在利用空余時(shí)間自學(xué)C#后寫的,上面提到的功能都實(shí)現(xiàn)了。




private void btnDownload_Click(object sender, EventArgs e)

{

btnDownload.Enabled = false;

pBarLoading.Visible = false;

if (!this.connect())

{

Debug.WriteLine("Udp server building unsuccessfully");

textBoxStatus.ForeColor = Color.Red;

textBoxStatus.AppendText("Udp server building unsuccessfullyrn");

textBoxStatus.ForeColor = Color.Black;

btnDownload.Enabled = true;

return;

}


try

{

loaderReader = new StreamReader(textBoxFile.Text);


}

catch (Exception ex)

{

Debug.WriteLine("Error: " + ex.Message);

textBoxStatus.ForeColor = Color.Red;

textBoxStatus.AppendText("Read hex file unsuccessfullyrn");

textBoxStatus.ForeColor = Color.Black;

loaderReader.Close();

loaderServer.Close();

btnDownload.Enabled = true;

return;

}


loaderFrame = new SerialFrame();

DateTime startTime = DateTime.Now;

IPEndPoint clientPoint = new IPEndPoint(IPAddress.Any, 0);

if (!loaderServer.Read(readyMsg,timeSpan))

{

Debug.WriteLine("Error: Timeout receive ready message from bootloader");

textBoxStatus.ForeColor = Color.Red;

textBoxStatus.AppendText("Timeout receive ready message from bootloaderrn");

textBoxStatus.ForeColor = Color.Black;

loaderServer.Close();

loaderReader.Close();

btnDownload.Enabled = true;

return;

}


if (!erase())

{

textBoxStatus.ForeColor = Color.Red;

textBoxStatus.AppendText("Erase unsuccessfullyrn");

textBoxStatus.ForeColor = Color.Black;

loaderReader.Close();

loaderServer.Close();

btnDownload.Enabled = true;

return;

}


pBarLoading.Refresh();

pBarLoading.Visible = true;

pBarLoading.Value = 0;

pBarLoading.Maximum = loaderLines;

pBarLoading.Step = 1;


string recordLine;

Address_U = 0;

bool isNextLineUserID = false;

bool isNextLineConfigBits = false;

textBoxStatus.AppendText("rnDownloading hex file ...rn");

try

{

while (loaderReader.Peek() >= 0)

{

pBarLoading.PerformStep();

recordLine = loaderReader.ReadLine();


if (recordLine.Contains(EXTEND_TOKEN) == true)

{

if (recordLine.Contains(USER_ID_TOKEN) == true)

{

isNextLineUserID = true;

continue;

}

else if (recordLine.Contains(CONFIG_BITS_TOKEN) == true)

{

const int ADDR_U_START_INDEX = 9;

const int ADDR_U_LENGTH = 4;

string addrU = recordLine.Substring(ADDR_U_START_INDEX, ADDR_U_LENGTH);

Address_U = Convert.ToInt32(addrU, 16) << 16;

isNextLineConfigBits = true;

continue;

}

else

{

const int ADDR_U_START_INDEX = 9;

const int ADDR_U_LENGTH = 4;

string addrU = recordLine.Substring(ADDR_U_START_INDEX, ADDR_U_LENGTH);

Address_U = Convert.ToInt32(addrU, 16) << 16;

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

總線-Ethernet與EtherCAT的比較

關(guān)鍵字: ethercat ethernet

  隨著半導(dǎo)體技術(shù)的不斷進(jìn)步(按照摩爾定律),MCU內(nèi)部集成的邏輯功能外設(shè)越來越多,存儲器也越來越大。消費(fèi)者對于汽車節(jié)能(經(jīng)濟(jì)和法規(guī)對排放的要求)型、舒適性、互聯(lián)性、安全性(功能安全和信息安全)

關(guān)鍵字: bootloader 汽車電子

1.之所以要實(shí)現(xiàn)一個(gè)專用的bootloader,一是為了更好的移植和自身的升級,二是為了方便操作系統(tǒng)的調(diào)試,當(dāng)然,你完全可以將這部分所要實(shí)現(xiàn)的與操作系統(tǒng)相關(guān)的功能集成到操作

關(guān)鍵字: bootloader 如何實(shí)現(xiàn) 嵌入式開發(fā)

一、Android網(wǎng)絡(luò)簡介Android與服務(wù)器的通信方式主要有兩種,一種是Http通信,另一種是Socket通信。HTTP通信:Android中內(nèi)置HttpClient,這樣可以發(fā)方便的發(fā)送Http

關(guān)鍵字: Android tcp協(xié)議 網(wǎng)絡(luò)通信

先將需要共用的程序定義在固定了FLASH地址中:#pragma arm section code=".ARM.__at_0x800F000"void Function(void){}#pragma a...

關(guān)鍵字: app bootloader STM32

  今天介紹下我新完成的為Microchip的32位單片機(jī)PIC32MZ2048ECH144開發(fā)的UART bootloader程序。整個(gè)工程分兩部分,第一部分是單片機(jī)端用XC32編譯的bootloader程序PhsBo...

關(guān)鍵字: bootloader c#語言 C語言 pic32 serial 串口通信
關(guān)閉