09. august 2006 - 10:06Der er
29 kommentarer og 2 løsninger
sockets driller
hej eksperter
jeg sidder her og roder med sockets...
jeg har et program på en pc, som skal kommunikere med en såkaldt WebPIC (et print med en PIC-processor, rj45-stik og rs232-stik)
dette print kan indstilles til at spytte data der kommer ind på tcp/ip-porten ud på rs232-porten og omvendt
jeg har tilsluttet begge interfaces til min comp og hvis jeg kører telnet på tcp/ip-porten og hyper terminal på rs232-porten virker det fint begge veje.
mit problem er at jeg ikke kan "lytte" på tcp/ip-porten i mit program, jeg har fundet det her kode:
// connect til server TcpClient cli = new TcpClient("192.168.0.201", 23); StreamWriter sw = new StreamWriter(cli.GetStream()); StreamReader sr = new StreamReader(cli.GetStream()); string line; string[] parts;
// skriv til server int a = 12; int b = 34; sw.WriteLine("ADD " + a + " " + b); sw.Flush();
// læs fra server og skriv resultat til skærm line = sr.ReadLine(); parts = line.Split(" ".ToCharArray()); int c = int.Parse(parts[1]); MessageBox.Show(c.ToString());
// skriv til server string s = "abc"; sw.WriteLine("DUP " + s); sw.Flush();
// læs fra server og skriv resultat til skærm line = sr.ReadLine(); parts = line.Split(" ".ToCharArray()); string s2 = parts[1]; MessageBox.Show(s2);
// disconnect cli.Close();
(jeg har fundet det i en artikel herinde af arne_v)
det sender godt nok det første data (ADD 12 34) til pic'en og jeg ser det i min hyper terminal, men så crasher programmet...
hvordan får jeg den til at modtage det jeg sender ind på tcp/ip?
håber der er nogle kloge hoveder der kan hjælpe, for jeg er sq ved at køre død i det her..
når jeg kalder funktionen og derefter åbner terminalvinduet, er den blå bar foroven stadig mørk, som om programmet "lå øverst" så går der lidt, så bliver den grålig som den skal, når jeg så vil lukke programmet siger den at programmet ikke svarer...
ja, altså jeg står og venter, og pic'en svarer ikke lige med det samme (det er indtil videre mig selv der skal skrive i hyperterminalen før den svarer, så der går jeg lige et par sekunder...) men en time out lyder bestemt som noget der kunne være løsningen, det prøver jeg lige... hvor skal den stå?
Den er i millisekunder, så mit eksempel fra før venter i 5 sekunder.
Hvis der så går mere en 5 sekunder, får du en IOException, så du skal lige have en try catch a la:
TcpClient cli = null; try { // connect til server cli = new TcpClient("192.168.0.201", 23); cli.ReceiveTimeout = 5000; StreamWriter sw = new StreamWriter(cli.GetStream()); StreamReader sr = new StreamReader(cli.GetStream()); string line; string[] parts;
// skriv til server int a = 12; int b = 34; sw.WriteLine("ADD " + a + " " + b); sw.Flush();
// læs fra server og skriv resultat til skærm line = sr.ReadLine(); parts = line.Split(" ".ToCharArray()); int c = int.Parse(parts[1]); MessageBox.Show(c.ToString());
// skriv til server string s = "abc"; sw.WriteLine("DUP " + s); sw.Flush();
// læs fra server og skriv resultat til skærm line = sr.ReadLine(); parts = line.Split(" ".ToCharArray()); string s2 = parts[1]; MessageBox.Show(s2); } catch(IOException ex) { MessageBox.Show("IO: " + ex.Message); } catch(Exception ex) { MessageBox.Show("Generel: " + ex.Message); } finally { // disconnect if(cli != null) cli.Close(); }
så langt så godt, hvis jeg ikke sender noget tilbage, så kommer den godt nok med en exception, men hvis jeg svarer, inden de 5 sekunder, så crasher det...
når jeg sender lidt forskellige chars fra hyperterminalen og afslutter med 2 gang "enter" kommer der en fejlmeddelelse, hvor der står: "Generel: indekset lå uden for arrayets grænser"
okay, jeg postede et indlæg, men det må have været samtidig med dig spif2001, for den blev ikke sat ind, så jeg prøver igen:
har lavet koden om så den ser sådan ud:
// læs fra server og skriv resultat til skærm line = sr.ReadLine(); MessageBox.Show(line.ToString());
i stedet for sådan:
// læs fra server og skriv resultat til skærm line = sr.ReadLine(); parts = line.Split(" ".ToCharArray()); int c = int.Parse(parts[1]); MessageBox.Show(c.ToString());
og nu virker det, jeg skal dog trykke enter 2 gange i terminalvinduet, men det er lige meget
kan i ikke smide svar begge 2, så kan i dele de 200p, det var trods alt siz23 der kom med den enter-ide, men spif har osse hjulpet en del i starten :)
TcpClient cli = null; try { // connect til server cli = new TcpClient("192.168.0.201", 8000); cli.ReceiveTimeout = 5000; StreamWriter sw = new StreamWriter(cli.GetStream()); StreamReader sr = new StreamReader(cli.GetStream()); string line; string line1;
// skriv til server int a = 12; int b = 34; sw.WriteLine("ADD " + a + " " + b); sw.Flush();
// læs fra server og skriv resultat til skærm line = sr.ReadLine(); MessageBox.Show(line.ToString());
// skriv til server string s = "abc"; sw.WriteLine("DUP " + s); sw.Flush();
// læs fra server og skriv resultat til skærm line1 = sr.ReadLine(); MessageBox.Show(line1.ToString()); } catch (IOException ex) { MessageBox.Show("IO: " + ex.Message); } catch (Exception ex) { MessageBox.Show("Generel: " + ex.Message); } finally {
// disconnect if (cli != null) cli.Close(); }
men når jeg har modtaget det jeg først sender tilbage, så sender programmet anden gang "DUP abc" og når jeg "svarer" på den, kommer programmet op med messageboxen ved den første karakter der bliver skrevet i terminalvinduet, og er tom...
synes ikke umiddelbart at det giver mening når jeg skal trykke enter 2 gange første gang...
Det lyder altså lidt som om, at der er uenighed om, hvornår de to programmer henholdsvis sender og modtager.
Sådan som du beskriver det, må der være noget galt med den protokol der er sat op.
Gennemgå protokollen minutiøst, så du / i er 100% sikre på hvad der bliver sendt / modtaget hvornår, og hvad der skal til for at protokollen kommer videre.
jamen indtil videre er det jo mig der leger PIC via terminalen og når jeg modtager den første besked, sender jeg noget og trykker enter 2 gange, i programmet kommer der en messagebox, med hvad jeg har sendt fra terminalen og når jeg trykker ok i den, sender den næste besked (DUP abc) som terminalen modtager. og så snart jeg trykker en hvilken som helst tast i terminalen, kommer messageboxen op i programmet...
heh, synes ikke lige de 5 linjer var et svar værd, så du for lige lidt extra.
p.s. har ikke lige en compiler til at checke efter syntax fejl mm. men skulle værre til at finde ud af. og kan nok også laves på en pænnere måde :D men burde løse dit enter problem, og dit enter problem kan opstå fordi "enter" på din telnet ikke er en windows enter, fx. bruger windows #13#10 (eller #10#13, kan aldrig huske :=) som enter. og din telnet bruger måske det #10#13 hvilket vil sige at du vil værre nødtil at lave 2 x enter for at få windows kode for ENTER. Håber det giver mening har desvære ikke så meget tid, så bliver en lidt rodet reply. /soz
string s; StreamReader sr = new StreamReader(cli.GetStream()); while (true) { if (sr.Peek() >= 0) { label1.Text = "modtager data"; if (sr.Peek() == 13) { //enter fundet afbryd lykken s += "\n"; //tilføj et enter tegn til din streng break; } s += sr.Read(); } else { label1.Text = "klar til at modtage mere data"; Application.DoEvents(); //køre beskeder der ligger i msg loop, bla. så windows ikke tror dit program er dødt. } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.