久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
哈哈我成功了《TCP下的數(shù)據(jù)發(fā)送&接收》通過看手冊搞定的
[打印本頁]
作者:
xuwei
時間:
2015-6-13 16:59
標(biāo)題:
哈哈我成功了《TCP下的數(shù)據(jù)發(fā)送&接收》通過看手冊搞定的
哈哈我今晚上終于搞定了網(wǎng)卡的TCP包的接收,我是星期一來上班的,師傅就給我一個網(wǎng)卡讓我做個類似服務(wù)器性質(zhì)終端,幸好去年我搞過一點(diǎn)ENC的ARP要不直接不會,每天都是看手冊看手冊看手冊,程序也一點(diǎn)一點(diǎn)的建立起來,但是昨天和今天所有的路子都鋪好了,就差包接收和發(fā)送了,發(fā)送的時候算法是自己搞的結(jié)果出了問題,今天又高接收,搞了一天,問題是我老是受到TCP數(shù)據(jù)后會出現(xiàn)亂碼,后來反復(fù)實(shí)驗(yàn)發(fā)現(xiàn)這是溢出緩存造成的數(shù)據(jù)過沖,今晚上看了DATESHEET才發(fā)現(xiàn)人家有算法,把人家的算法編程后,哈哈爽啊!
下面是程序:(部分代碼)亂了點(diǎn)卻是原汁原味的
2012年2月9日于日照高科園
20:52
據(jù)我測試沒有丟包
沒有亂碼
流程:
PC發(fā)送TCP數(shù)據(jù)流到路由器
路由器轉(zhuǎn)發(fā)到網(wǎng)卡
網(wǎng)卡轉(zhuǎn)發(fā)到MCU
MCU通過串口發(fā)到PC
形成一個環(huán)回數(shù)據(jù)流
估計今晚上睡不著了。。。。。。
uchar flage;
uint get_size; //接收的數(shù)據(jù)大小
uint get_offset; //偏移地址
uint get_start_address;//緩存的物理地址
uint upper_size;//多余的字節(jié)
//uint destination_addr;//中間地址
uint left_size;//
// uint destination_addr;
/*******用來做接收計數(shù)使*********/
uint S0_RX_NUMB; //接收的數(shù)據(jù)字節(jié)總個數(shù)
uchar S0_RX_NUMB_DAT1; //中間量用于16-8位轉(zhuǎn)換
/*******************
要讀接受的數(shù)據(jù)就要知道當(dāng)前的物理地址
而當(dāng)前的物理地址就得要讀這兩個寄存器
間接的計算出物理地址
計算方法就是手冊上的
**************/
uint S0_RX_RD;//當(dāng)前接收緩存地址
uchar S0_RX_RD_DAT0,S0_RX_RD_DAT1; //中間量用于16-8位轉(zhuǎn)換
uint numb; //計數(shù)參照
uint S0_RX_START_ADDRESS;//接收緩存的實(shí)際物理地址
uchar a;
/***************
*************/
while(read_register(S0_SSR)!=0x17);//客戶端:TCP連接成功轉(zhuǎn)入了SOCKT_EASTABLISHED狀態(tài)(可以進(jìn)行數(shù)據(jù)收發(fā))
/******************************************************
判斷是否接收導(dǎo)數(shù)據(jù)
****************************************************/
do
{
//SendOneByte(read_register(S0_IR));//
a=read_register(S0_IR);
a=a&0x04;
}
while(a!=0x04);//是否姐收到數(shù)據(jù)包是向下
write_register(S0_IR,0xFF);
S0_RX_NUMB=read_register(S0_RX_RSR0);
S0_RX_NUMB_DAT1=read_register(S0_RX_RSR1);
S0_RX_NUMB<<=8;
S0_RX_NUMB+=S0_RX_NUMB_DAT1;
get_size=S0_RX_NUMB;
S0_RX_RD=read_register(S0_RX_RD0);
S0_RX_RD_DAT1=read_register(S0_RX_RD1);
S0_RX_RD<<=8;
S0_RX_RD+=S0_RX_RD_DAT1;
get_offset=(S0_RX_RD&gS0_RX_MASK);
get_start_address=gS0_RX_BASE+get_offset;
if((get_offset+get_size)>(gS0_RX_MASK+1))
{
upper_size=(gS0_RX_MASK+1)-get_offset;
for(numb=0;numb<upper_size;numb++)
{
SendOneByte(read_register((get_start_address+numb)));
}
for(numb=0;numb<left_size;numb++)
{
SendOneByte(read_register((gS0_RX_BASE+numb)));
}
}
else
{
for(numb=0;numb<get_size;numb++)
{
flage=read_register((get_start_address+numb));
SendOneByte(read_register((get_start_address+numb)));
if(flage==0x31)
{
bell=0;
}
if(flage==0x32)
{
bell=1;
}
}
}
S0_RX_RD+=get_size;
S0_RX_RD_DAT1=S0_RX_RD;
S0_RX_RD_DAT0=(S0_RX_RD>>8);
write_register(S0_RX_RD0,S0_RX_RD_DAT0);
write_register(S0_RX_RD1, S0_RX_RD_DAT1);
write_register(S0_CR,RECV);//
作者:
xuwei
時間:
2015-6-13 17:00
哈哈原來就是這么簡單,奧秘都在手冊里呢!!!要什么有什么!中文手冊真是不敢恭維,還是人家老外牛逼不服不行!!
發(fā)包程序:
/*********************
發(fā)TCP送數(shù)據(jù)包
完全根據(jù)DATESHEET做的
2012年2月10日
與日照
王均偉
9::31
**********************/
void send_packet_tcp()
{
uint S0_TX_WR;//發(fā)送寫指針
uchar S0_TX_WR0_DAT0,S0_TX_WR0_DAT1;//中間變量
// uint S0_TX_START_ADDRESS;//發(fā)送緩存的實(shí)際物理地址
uint numb;
uint get_free_size;//發(fā)送區(qū)剩余空間
uint send_size;//發(fā)送字節(jié)數(shù)
uint get_offset;//偏移地址
uint get_start_address;//緩存的物理地址
uint upper_size;
uint left_size;
while(read_register(S0_SSR)!=0x17);//客戶端:TCP連接成功轉(zhuǎn)入了SOCKT_EASTABLISHED狀態(tài)(可以進(jìn)行數(shù)據(jù)收發(fā))
send_size=30;//發(fā)送字節(jié)為10個
//抓取剩余空間大小
get_free_size=read_register(S0_TX_FSR0);
get_free_size<<=8;
get_free_size+=read_register(S0_TX_FSR1);
//如果發(fā)送空間小于發(fā)送數(shù)據(jù)字節(jié)那么出錯
if(get_free_size<send_size)
{
//ERRO
while(1);
}
S0_TX_WR=read_register(S0_TX_WR0);
S0_TX_WR<<=8;
S0_TX_WR+=read_register(S0_TX_WR1);
get_offset=S0_TX_WR&gS0_TX_MASK;//計算偏移
get_start_address=gS0_TX_BASE+get_offset;//計算物理地址
if((get_offset+send_size)>(gS0_TX_MASK+1))
{
upper_size=(gS0_TX_MASK+1)-get_offset;
for(numb=0;numb<upper_size;numb++)
{
write_register(get_start_address+numb,0xcc);//發(fā)送數(shù)據(jù)
}
left_size=send_size-upper_size;
for(numb=0;numb<left_size;numb++)
{
write_register(gS0_TX_BASE+numb,0xcc);//發(fā)送數(shù)據(jù)
}
}
else
{
for(numb=0;numb<send_size;numb++)
{
write_register(get_start_address+numb,0xcc);//發(fā)送數(shù)據(jù)
}
}
S0_TX_WR+=send_size;
S0_TX_WR0_DAT1=S0_TX_WR;
S0_TX_WR0_DAT0=((S0_TX_WR>>8)&0x00ff);
write_register(S0_TX_WR0,S0_TX_WR0_DAT0);
write_register(S0_TX_WR1,S0_TX_WR0_DAT1);//寫發(fā)送緩存區(qū)最開始字節(jié)從0x4000+(S0_TX_WR&0x07ff)
write_register(S0_CR,SEND);//發(fā)送
// SendOneByte(read_register(S0_TX_FSR0));//串口發(fā)送發(fā)送緩沖的剩余空間
// SendOneByte(read_register(S0_TX_FSR1));//串口發(fā)送發(fā)送緩沖的剩余空間
//write_register(S0_TX_RD0,0x0);
// write_register(S0_TX_RD1,0);//寫發(fā)送緩存區(qū)最開始字節(jié)從0x4000+(S0_TX_WR&0x07ff)
/* S0_TX_WR0_DAT1=S0_TX_WR;
S0_TX_WR0_DAT0=((S0_TX_WR>>8)&0x00ff);
write_register(S0_TX_WR0,S0_TX_WR0_DAT0);
write_register(S0_TX_WR1,S0_TX_WR0_DAT1);//寫發(fā)送緩存區(qū)最開始字節(jié)從0x4000+(S0_TX_WR&0x07ff)
//帶入得:0X4000+0=0X4000;這就是端口0的開始地址也是我要開始寫數(shù)據(jù)的地址
S0_TX_START_ADDRESS=(S0_TX_BASE+(S0_TX_WR&S0_TX_MASK));
for(numb=0;numb<1024;numb++)
{
S0_TX_START_ADDRESS++;
//寫緩存
write_register(S0_TX_START_ADDRESS,0xcc);//
}
*/
//發(fā)送數(shù)據(jù)后得把寫指針原先的值加上數(shù)據(jù)長度在寫入寫指針,表示數(shù)據(jù)后移
/* S0_TX_WR=S0_TX_WR+numb;
S0_TX_WR0_DAT1=S0_TX_WR;
S0_TX_WR0_DAT0=((S0_TX_WR>>8)&0x00ff);
write_register(S0_TX_WR0,S0_TX_WR0_DAT0);
write_register(S0_TX_WR1,S0_TX_WR0_DAT1);//寫發(fā)送緩存區(qū)最開始字節(jié)從0x4000+(S0_TX_WR&0x07ff)
write_register(S0_CR,SEND);//發(fā)送
while((read_register(S0_IR)&0x10)!=0x10);
write_register(S0_IR,0xff);//發(fā)送
SendOneByte(read_register(S0_SSR));//
SendOneByte(read_register(S0_IR));//
SendOneByte(read_register(S0_TX_RD0));//串口發(fā)送發(fā)送緩沖的剩余空間
SendOneByte(read_register(S0_TX_RD1));//串口發(fā)送發(fā)送緩沖的剩余空間
SendOneByte(read_register(S0_TX_WR0));//串口發(fā)送發(fā)送緩沖的剩余空間
SendOneByte(read_register(S0_TX_WR1));//串口發(fā)送發(fā)送緩沖的剩余空間
// SendOneByte(read_register(S0_TX_FSR0));//串口發(fā)送發(fā)送緩沖的剩余空間
// SendOneByte(read_register(S0_TX_FSR1));//串口發(fā)送發(fā)送緩沖的剩余空間
// SendOneByte(read_register(S0_TX_START_ADDRESS));//串口發(fā)送發(fā)送緩沖的剩余空間
// SendOneByte(read_register(S0_TX_START_ADDRESS-1));//串口發(fā)送發(fā)送緩沖的剩余空間
*/
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩欧美大片在线观看
|
日韩二区三区
|
日本精品一区二区三区视频
|
久久成人精品视频
|
永久免费在线观看
|
亚洲精品日日夜夜
|
国产精品欧美一区二区三区
|
特级做a爱片免费69 精品国产鲁一鲁一区二区张丽
|
久久久久www
|
国产成人亚洲精品
|
国产成人精品午夜视频免费
|
欧美性视频在线播放
|
国产福利视频
|
欧美精品99
|
国产精品免费一区二区三区
|
成人h动漫亚洲一区二区
|
农夫在线精品视频免费观看
|
91av视频
|
欧美色综合
|
日韩中文字幕在线观看视频
|
国产福利在线
|
精品美女视频在免费观看
|
欧美日韩一区二区在线观看
|
亚洲视频一区在线观看
|
在线看片网站
|
亚洲第一av
|
欧美综合国产精品久久丁香
|
色狠狠桃花综合
|
国产精品久久久久久高潮
|
日韩视频免费
|
成年人的视频免费观看
|
国产成人99久久亚洲综合精品
|
久色视频在线观看
|
手机看黄av免费网址
|
亚洲精品一区二区在线观看
|
亚洲免费观看视频网站
|
日本视频中文字幕
|
久久久久网站
|
www.日韩
|
在线日韩视频
|
免费美女网站
|