串口Xmodem協(xié)議的發(fā)送數(shù)據(jù)_第1頁
串口Xmodem協(xié)議的發(fā)送數(shù)據(jù)_第2頁
串口Xmodem協(xié)議的發(fā)送數(shù)據(jù)_第3頁
串口Xmodem協(xié)議的發(fā)送數(shù)據(jù)_第4頁
串口Xmodem協(xié)議的發(fā)送數(shù)據(jù)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、串口 xmodem協(xié)議的發(fā)送數(shù)據(jù)程序日期:2007-05-21編寫:李猛xmodem協(xié)議xmodem協(xié)議備注:此程序中430為發(fā)送方說明:1.程序開始時,會循環(huán)等待nak的到來,只要收到的不是nak,就會一直等待下去,直到收到了 nak,才開始數(shù)據(jù)的發(fā)送;2上一輪如杲發(fā)送的是-組數(shù)據(jù),則收到can,程序就中止; 收到ack,就發(fā)送下一組數(shù)據(jù);收到nak,就發(fā)送上一組數(shù)據(jù); 如果收到的不是上面三種,程序就返回,直到出現(xiàn)三個中的某一個;3上一輪如果發(fā)送的是eot,收到can就中止;收到ack,就結(jié)束程序 收到nak,就再發(fā)送eot;收到的是其他數(shù)據(jù)就返冋,直到出現(xiàn)三個中的場#inelude <

2、; msp430x14x.h>#define uchar unsigned char#define nak 0x1 5/xmodem 協(xié)議中的術(shù)語# define ack 0x06#define can 0x18#define eot 0x04#define soh 0x01要發(fā)送的數(shù)據(jù),即430從此數(shù)組中取數(shù)據(jù)構(gòu)成數(shù)據(jù)包,共22字節(jié),分5次發(fā)送,最后一次補3個0x1 auchar filesend22= 0xaa,0xa9,0xa8,0xa7,0xa6)0xa5,0xa4,0xa3,0xa2,0xa1,0xa0,0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,ox99,ox

3、98,0x97,ox96,0x95;數(shù)據(jù)包,長9字節(jié),分別為soh、包序號、序號補碼、5字節(jié)數(shù)據(jù)、校驗碼uchar datasend9;uchar seq = 0x01;uchar cmpl;uchar esum;/數(shù)據(jù)包序號,初值為1數(shù)據(jù)包序號的補碼/垂直累加和校驗碼,初值為0uchar rec_pc;uchar k = 0;uchar j = 0;/收到的pc的確認命令指向filesend的標號,從中取數(shù)據(jù)時使用,初值為0指向datasend的標號,發(fā)送數(shù)據(jù)時使用,初值為0uchar fin_flag = 0;uchar eot_flag = 0;數(shù)據(jù)取完的標志,為1時表示filesend

4、川的數(shù)據(jù)已經(jīng)取完發(fā)送完成的標志,為1時表示430己經(jīng)發(fā)送過了 eot標志void lnit_clk();函數(shù)聲明void lnit_port();void lnit_uarto();void main(void)wdtctl = wdtpw + wdthold;關(guān)閉看門狗_dint();lnit_clk(); lnit_port();in it_uart0();_eint();while(1);關(guān)中斷一系列的初始化/開中斷等待:接收屮斷,功能全在接收中斷函數(shù)中完成/主程序只是循環(huán)等待i 時鐘初始化函數(shù)* */void lnit_ clk(void)bcsctl1 = 0x00;bcsctl1

5、+= xt2off; 關(guān)閉xt2,因為板子上沒有bcsctl1 += xts;低速振蕩器是高頻模式bcsctl2=0x00;bcsctl2 += selm0;bcsctl2 + = selm1;/mclk的時鐘源為低速晶體振蕩器此外,aclk的時鐘源為lftx1 , smclk的時鐘源為dc0clk /分頻因子均為1/* 端口初始化函數(shù) */void lnit_port(void)p3dir=0;p3sel= 0;/p3所有管腳均初始化為輸入方向和一般i/o ureturn;串口初始化函數(shù)nvoid init_uarto(void)u0ctl= swrst;uoctl += char;u0tc

6、tl=0x00;uotctl += sselo;u0br1 = 0x01;u0br0=0xa0;u0mctl=0xba;uoctl &= swrst;小行模塊設(shè)置時的必須/8位數(shù)據(jù)位,1位停止位,無校驗波特率時鐘源選擇為aclk/設(shè)置波特率為9600me1 |= utxe0+urxe0; 使能 usart0 模塊ie1 |= urxie0;使能usart0的接收中斷p3sel |= bit4+bit5; /p3.4 和 p3.5 為串 口功能p3dir |= bit4;/p3.4 為輸岀return;/* 接收中斷函數(shù) */#pragma vector= usartorx_vector

7、interrupt void usartorx()rec_pc = rxbufo;接收到的pc的命令if (rec_pc = can)while (1); 如果接收到can命令,則取消傳輸,程序中止/程序在此處循環(huán),不再跳出中斷if (k = 0)/k= 0表示這是第一次接收pc命令,判斷是否是開始傳輸?shù)臉酥緉akif (rec_pc= nak) /收到nak則開始發(fā)送第一組數(shù)據(jù),收到的不是nak則返回繼續(xù)等待nakcmpl = oxff- seq;計算包序號補碼csum = filesendk + filesendk+ 1 + filesendk+2 + filesendk+3+ files

8、endk+4;計算垂直累加和校驗碼datasendo = soh;datase nd1 = seq;datasend2=datasend3=cmpl;filesendk; datasend4 = filesendk+ 1 ; datasend5filesendk+2 ;datasend6 = filesendk+ 3; datasend7 = filesendk+4;datase nd8 = csum;取得數(shù)據(jù)包while (j<9)/發(fā)送數(shù)拯包while (ifg1 & utxi fg0) = = 0);txbufo = datasendj;j + + ;k = k+5;seq

9、+ +;指向下一組數(shù)據(jù)/數(shù)據(jù)包序號增1j = 0; return;/返回,不在執(zhí)行下面的語句if (k != 0)/k! = 0,表示己經(jīng)發(fā)送過了數(shù)據(jù)包.接收到的是pc對數(shù)據(jù)包的確認命令if (rec_pc= nak)/pc發(fā)m nak,則把剛才發(fā)送的數(shù)拯包重新發(fā)送-遍if (eot_flag = 1)/如果剛才發(fā)送的不是數(shù)據(jù),而是eot,則再將eot重新發(fā)送while (ifg1 & utxifg0) = = 0);txbufo = eot;eot_flag = 1;return; while (j<9)while (ifg1 & utxi fg0) = = 0);tx

10、bufo = datasendj;j + + ;j = 0;if (rec_pc= ack)if (eot_flag= 1)表明剛才發(fā)送的是eot,此吋pc發(fā)回的ack是對剛才發(fā)送的eot的確認,程序完成while (1);else if (fin_flag = 1) /表明剛才發(fā)送的是最后一個數(shù)據(jù)包此時pc發(fā)回的ack是對剛才發(fā)送的最后一個數(shù)據(jù)包的確認數(shù)據(jù)發(fā)送完成,發(fā)送eot,返回等待確認while (ifg1 & utxi fg0) = = 0);txbuf0 = eot;eot_flag = 1;else剛才發(fā)送的是一組普通的數(shù)據(jù),取下一個數(shù)據(jù)包并發(fā)送cmpl = oxff -

11、seq;/判斷是否己經(jīng)發(fā)送到了最后一組數(shù)據(jù)if (k= = 20)csum = filesend k + filesend k+ 1 + 0x1 a+0x1a+ 0x1 a;datasendo = soh;datasend1 = seq;datasend2 = cmpl;datasend3 = filesendfk; datasend4 = filesendk+ 1 ; datasend5=0x1a;datasend6 = 0x1 a; datasend7 = 0x1a;datase nd8 = csum;fin_flag = 1;elsecsum =filesendk + filesendk+ 1 + filesendk+ 2 + filesendk+ 3 + filesendk+ 4;datasendo = soh;datasend1 = seq;datasend2 = cmpl;datasend3 = filesendfk; datasend4 = filesendk+ 1 ; datasend5=f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論