Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

TCP Data gönderme

Başlatan respected, 22 Temmuz 2014, 17:23:24

respected

Aşağıda TCP data gönderme rutini vardır. Burada MAX_BUFFER_SIZE değeri büyüdüğü zaman data gönderme işlemi 3-4 defadan sonra kesiliyor.  MAX_BUFFER_SIZE değerini  küçültünce 20-30 kez data gönderilebiliyor fakat bir süre sonra yine data gönderimi kesiliyor.
Emin değilim ama sanki bellek sorunu var gibi. sorun acaba nedir? Sorunu ve çözümünü bilen arkadaş varmı?
Teşekkürler.
#define MAX_BUFFER_SIZE 0x800
int sendFromSock(int8u shortSocket, int8u * sendBuf, int16u len, int8u timeout, int8u seq)
{
    int8u buf[MAX_BUFFER_SIZE+6];
    int16u mybufsize;


    if (len == 0 || len > MAX_BUFFER_SIZE) {
        len = MAX_BUFFER_SIZE;
    }
    buf[0] = SNIC_SEND_FROM_SOCKET_REQ;
    buf[1] = seq;
    buf[2] = shortSocket;
    buf[3] = 0;

    mybufsize = swap16(len);
    memcpy(buf+4, (int8u*)&mybufsize, 2);
    memcpy(buf+6, sendBuf, len);

    serial_transmit(CMD_ID_SNIC, buf, 6+len, ACK_NOT_REQUIRED);

    printf("-sendFromSock\n\r");

    while (1) {
        if(SN8200_API_HasInput()) {
            ProcessSN8200Input();
        }
        if(IsSNICSendFromSocketResponsed) {
            IsSNICSendFromSocketResponsed = false;
            break;
        }
        mdelay(1);
				
    }

ercan_t

merhaba,

bir TCP paket olarak en fazla 1450 bayt gönderilebilir diye biliyorum 2048(x800) çok büyük.

MAX_BUFFER_SIZE pajetini ne kadar kücültüyorsunuz?
Ayrıca TCP paketlerini gönderdikten sonra alındı bilgisi geliyor mu? sürekli göndermek stack overflow olabilir.

respected

Hocam 0x800 yerine 0x80 ya da 0x8 yazıyorum. Data gönderme adedi artıyor ama bir süre sonra kesiliyor. Muhtemelen söylediğiniz gibi stack overflow oluyor. Bunu engellemek için ne yapmak lazım. Ayrıca kullandığım donanım STM32F4+ discover wifi

erenbasturk

Büyük ihtimalle TX' buffer'ın doluyor. TX buffer'ını nerede boşaltıyorsun?

respected

unsigned char dummy_tx(unsigned char c)
{
    tempReTXBuf[tempReTXLen++] = c;
    if (c == EOM_CHAR || tempReTXLen >= SEND_BUF_SIZE) {
        SN8200_HAL_SendData(tempReTXBuf, tempReTXLen);

        memset(tempReTXBuf, 0, tempReTXLen);
        tempReTXLen = 0;
    }
		for(reset=0;reset<4096;reset++)
		{	
			tempReTXBuf[reset]=0;
		}
    return c;
}


Buffer resetlemeyi burada yapıyorum. Bu haliyle anlatmak zor olacak sanırım. Projenin tamamını buraya koymak lazım sanırım. Şu an üzerinde çalıştığımdan epey bir dağıttım. Toparlayıp yeniden burada paylaşırsam belki çözüm bulunabilir. Biraz daha uğraşalım bakalım.

ercan_t

merhaba,

kodda sadece buffer i sıfırla doldurmuşsun, buffer in pointer index counter değişkenini de başa alman gerekiyor,

ayrıca tx buffer boşaltma işini karşı tarafın soketinden ACK-SYNC aldığında boşaltman ve başa alman gerekli, ACK SYN gelene kadar beklemelisin yeni data gönderme, eğer temout süresince(5-10sn) ACK  gelmezse soket kopmuş veri ulaşmamıştır, tekrar connection kurup , bufferları boşaltıp aynı işleri tekrarlaman gerekli.

respected

#6
main rutinine aşağıdaki kodu ekleyince buffer sorunu yaşamadan istediğimiz kadar data yollayabiliyoruz.  wifi den herhangi bir hareket algılandığında datayı gönderiyor. ya SN8200_API_HasInput() fonksiyonu içerisinde ya da ProcessSN8200Input(); fonksiyonu içerisinde buffer sıfırlanıyor olmalı.

şimdilik bu şekilde gönderim yapabiliyorum. Çözdükçe burada paylaşırım


        if(SN8200_API_HasInput()) {
            ProcessSN8200Input();
					 {
        char teststr[128]={'M','E','H','M','E','T'};
        int len;
        len = (int)strlen(teststr);
        sendFromSock(0x0005, (int8u*)teststr, len, 2, seqNo++);
				sendFromSock(0x0006, (int8u*)teststr, len, 2, seqNo++);

     
    }

Bu arada 0x0005 ve 0x0006 wifi den bağlanan client ların soket leridir.