|
哈哈原來就是這么簡(jiǎn)單,奧秘都在手冊(cè)里呢。!要什么有什么!中文手冊(cè)真是不敢恭維,還是人家老外牛逼不服不行。
發(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個(gè)
//抓取剩余空間大小
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é)那么出錯(cuò)
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;//計(jì)算偏移
get_start_address=gS0_TX_BASE+get_offset;//計(jì)算物理地址
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ù)長(zhǎng)度在寫入寫指針,表示數(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ā)送緩沖的剩余空間
*/
|
|