📄 main.c
字号:
send(i, &sio_buf[read], D_size);
}
else {
memcpy(&temp_sio_buf[0], &sio_buf[read], tmp_cnt);
memcpy(&temp_sio_buf[tmp_cnt], &sio_buf[0], wr_ptr);
send(i, &temp_sio_buf[0], D_size);
}
read += D_size;
}
else {
send(i, &sio_buf[read], D_size);
read += D_size;
}
D_sendOK = 0;
C_sendOK = 0;
T_sendOK = 0;
}
if (T_sendOK == 1) {
flag = Calc_dSize();
if (flag == 2) return;
if (flag) {
memcpy(&temp_sio_buf[0], &sio_buf[read], tmp_cnt);
memcpy(&temp_sio_buf[tmp_cnt], &sio_buf[0], wr_ptr);
send(i, &temp_sio_buf[0], data_cnt);
read = wr_ptr;
}
else {
send(i, &sio_buf[read], data_cnt);
read += data_cnt;
}
D_time_cnt = 0;
T_sendOK = 0;
}
}
}
void Update_Status(u_char flag)
{
if (flag) { // connected : Low
P1 &= 0xFB;
}else { // not connected : High
P1 |= 0x04;
}
}
/*
********************************************************************************
* Description : Main
* Arguments : None
* Returns : None
* Note :
********************************************************************************
*/
void main()
{
SOCKET i;
u_char j;
u_char state;
int len;
u_char xdata addr[4]; // Variable to be used in network configuration and recvfrom()
u_long xdata SpecifiedAddr;
u_char xdata addrstr[16];
u_int port; // Variable to be used to store Destination Port in recvfrom()
u_int RecvSize; // Variable to be used to store received data size
SOCKET s; // Variable to be used to designate channel of W3100A
char IsFirstRecv = 0; // Variable to be used to have been received data alreay. when it is set, Data is alreay received.
EA = 0; // All interrupt disable
Verify_RC2(); //
Verify_EEPROM(); // Check Valid EEPROM
// Read MAC, DEBUG, DHCP option
for (j = 0; j < 6; j++) Mac[j] = EEP_Read(EE_MAC1+j);
Debug_Off = (bit)(EEP_Read(EE_DEBUG));
DHCPisSet = (bit)(EEP_Read(EE_DHCP));
Init_Interrupt(); // Init 8051 Interrupt
RESTART :
// Init buffer pointer
wr_ptr = 0;
write = 0;
read = 0;
// Init Flow control variable
buffer_full = 0;
Stop_Sending = 0;
closeOK = 0;
I_time_cnt = 0 ;
my_time = 0;
DHCPisSuccess = 0;
K_time = 0;
Enable_SP = 0;
m_bSetted = 0;
m_bConnectSvr = 0;
m_bConnectCli = 0;
if (Flow_Ctrl == F_RTS) Loopback_CTS();
Init_SerialInt();
EA = 1;
if (!Debug_Off) {
PutString(" Ver. ");PutHTOA(SW_VERSION_H);PutByte('.');PutHTOA(SW_VERSION_L);
}
Init_Timer0();
if (DHCPisSet) {
Init_Net_Default(); // Init by 0.0.0.0
Init_Net_DHCP();
}else Init_Net(); // Init by EEPROM
SetupOption(); // Init option
if (!Debug_Off) PutString("\n\r> broad socket : ");
s = 0; // Use channel #0 of W3100A
socket(s,SOCK_DGRAM,3000,0); // Open UDP channel
socket(SOCK_CONFIG, SOCK_DGRAM, REMOTE_CLIENT_PORT, 0x80);
if (!Debug_Off) PutStringLn("OK..");
Update_Status(0);
i = SOCK_DATA;
while (1) {
if (Flow_Ctrl == F_RTS) Loopback_CTS();
if ((DHCPisSet == 1) && (DHCPisSuccess == 1)) check_dhcp();
if (Recv_ConfigMsg() == 1) break;
if (Enable_SP) {
if (select(i, SEL_SEND) == SSIZE[i]) {
Send_KeepalivePacket(i);
}
Enable_SP = 0;
}
if (m_bSetted == 0)
{
init_sock(i);
wait_10ms(10);
}
while(1) // Ping-Pong Service Routine
{
RecvSize = select(s,SEL_RECV); // When received data from port #3000, read the size and send it to peer's port #3000
if(RecvSize > 0)
{
RecvSize = recvfrom(s,(u_char xdata *)&sock_buf,RecvSize,addr,&port);
if(-1 == RecvSize) // Read data as size as buffer received
{
PutStringLn("\r\n<<<< Receive Fail >>>>");
break;
}
if(!IsFirstRecv)
{
SpecifiedAddr = *((u_long*)addr);
IsFirstRecv = 1;
}
inet_ntoa(addr,addrstr);
if(IsFirstRecv && SpecifiedAddr == *((u_long*)addr)) // it can receive data from another peer, but it can't send received data to the peer.
{
PutString(addrstr);PutString(" : Received Size = ");PutITOA(RecvSize);
RecvSize = sendto(s,(u_char xdata *)&sock_buf,RecvSize,addr,port);
if(RecvSize == -1) // Loopback received data to destination : Ping-Pong
{
PutStringLn("\r\n<<<< Send Fail >>>>");
break;
}
PutString(", Sended Size = ");PutITOA(RecvSize);PutStringLn("");
}
else // if the board received data from another peer
{
PutString("Unknown peer send 'PING' to the board : ");PutString(addrstr);PutStringLn("");
}
}
}
// else
// {
if (m_bServer == 1)
{// Server Mode
if ( m_bConnectSvr == 1 || m_bConnectCli == 1)
{
state = select(i, SEL_CONTROL);
if ( closeOK == 0 && state == SOCK_ESTABLISHED )
{
// Ethernet to Serial
if ((len = select(i, SEL_RECV)) > 0) Ether2Serial(i, len);
// Serial to Ethernet
EA = 0;
wr_ptr = write;
EA = 1;
if (wr_ptr == read) {
if ((Flow_Ctrl == F_XON) && (buffer_full == 1)) {
EA = 0;
PutByte(XON);
EA = 1;
buffer_full = 0;
}
}else { // if there are data to send...
Serial2Ether(i);
}
}
else
{
if ((len = select(i, SEL_RECV)) > 0)
{
Ether2Serial(i, len);
}
if (!Debug_Off) {
PutStringLn("Listen socket CLOSED");
}
close(i);
break;
}
}
else
{
if (sock_state[i] == SOCK_LISTEN) {
state = select(i, SEL_CONTROL);
if (state == SOCK_ESTABLISHED)
{
if (!Debug_Off) PutStringLn("connected");
sock_state[i] = SOCK_ESTABLISHED;
m_bConnectSvr = 1;
Update_Status(1);
EA = 0;
closeOK = 0;
I_time_cnt = 0;
EA = 1;
}
else if (state == SOCK_CLOSE_WAIT)
{
if (!Debug_Off) PutStringLn("Server socket CLOSED");
close(i);
break;
}
else if (state == SOCK_CLOSED)
{
if (!Debug_Off) PutStringLn("Server socket CLOSED");
break;
}
}
if (m_bConnectSvr == 0)
{
EA = 0;
wr_ptr = write;
EA = 1;
if (wr_ptr != read)
{
m_bSetted = 0;
m_bConnectCli = 1;
}
}
}
}
else
{ // Client Mode
if ( m_bConnectCli == 1)
{
state = select(i, SEL_CONTROL);
if ( closeOK == 0 && state == SOCK_ESTABLISHED )
{
if ((len = select(i, SEL_RECV)) > 0) Ether2Serial(i, len);
// Serial to Ethernet
EA = 0;
wr_ptr = write;
EA = 1;
if (wr_ptr == read) {
if ((Flow_Ctrl == F_XON) && (buffer_full == 1)) {
EA = 0;
PutByte(XON);
EA = 1;
buffer_full = 0;
}
}else { // if there are data to send...
Serial2Ether(i);
}
}
else
{
if ((len = select(i, SEL_RECV)) > 0)
{
Ether2Serial(i, len);
}
if (!Debug_Off) PutStringLn("Client socket CLOSED");
close(i);
break;
}
}
} // client mode
// }
} // while
if (!Debug_Off) PutStringLn("\n\r RESTART ");
Update_Status(0);
close(i);
goto RESTART;
}
/*
********************************************************************************
* Description : Re-initialization function for the disconnected channel.
* Arguments : i - socket number
* Returns : None
* Note :
********************************************************************************
*/
void init_sock(u_char i)
{
u_char val1, val2;
u_int listenport;
u_char j, PeerIP[4];
u_int PeerPort;
if (select(i, SEL_CONTROL) != SOCK_CLOSED) close(i);
wait_10ms(1);
if (m_bServer == 1 && m_bConnectCli == 0)
{
val1 = EEP_Read(EE_LPORTH);
val2 = EEP_Read(EE_LPORTL);
listenport = (u_int)((val1 << 8) + val2);
if (!Debug_Off) PutString("listen : ");
while ( socket(i, SOCK_STREAM, listenport, 0x80) == -1) ;
NBlisten(i);
if (!Debug_Off) PutStringLn("ok ...");
sock_state[i] = SOCK_LISTEN;
m_bSetted = 1;
}
else
{
val1 = EEP_Read(EE_SPORTH);
val2 = EEP_Read(EE_SPORTL);
PeerPort = (val1 << 8) + val2;
for (j = 0; j < 4; j++) {
PeerIP[j] = EEP_Read(EE_SIA1 + j);
}
while ( socket(i, SOCK_STREAM, clientport++, 0x80) == -1) ;
if (!Debug_Off) {
PutITOA(clientport-1);
PutString(" connect : ");
}
if (connect(i, PeerIP, PeerPort) == -1) {
m_bSetted = 0;
m_bConnectCli = 0;
EA = 0;
wr_ptr = 0;
write = 0;
read = 0;
EA = 1;
if (!Debug_Off) PutStringLn("connect fail");
}
else
{
m_bSetted = 1;
m_bConnectCli = 1;
Update_Status(1);
EA = 0;
closeOK = 0;
I_time_cnt = 0;
EA = 1;
if (!Debug_Off) PutStringLn(" ok..");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -