Problem med COMPort på FriendlyARM

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
Gildebrand
Inlägg: 1108
Blev medlem: 8 maj 2009, 21:40:49
Ort: Falun

Problem med COMPort på FriendlyARM

Inlägg av Gildebrand »

Hejsan!

Jag har en FriendlyARM mini2440, med Windows CE5 .Net på. Jag har installerat .Net Compact framework på den. Till den har jag skrivit ett program som ska skriva ut text över COMporten.

Till problemet då. Första gången man ska skriva ut något så funkar det någorlunda. Om jag vill skriva ut "Hello World!", så kan den till exempel skriva "Hello WorlHe", Andra gången man ska skriva ut över com-porten så skriver den bara ut första tecknet i kommandot. Jag har programmerat i C#.

Vad kan problemet vara?
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Problem med COMPort på FriendlyARM

Inlägg av Micke_s »

Jag skulle säga att baudrate:n inte stämmer exakt / oexakt klockkälla.
Hur snabbt kör du och vad har du som tar emot datan i andra änden?
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Problem med COMPort på FriendlyARM

Inlägg av bos »

Gildebrand skrev:Vad kan problemet vara?
Problemet kan vara precis vad som helst eftersom vi inte har en aning om hur du kopplat eller hur din kod ser ut.
Användarvisningsbild
Gildebrand
Inlägg: 1108
Blev medlem: 8 maj 2009, 21:40:49
Ort: Falun

Re: Problem med COMPort på FriendlyARM

Inlägg av Gildebrand »

Det har löst sig. Av någon konstig anledning så körde den aldrig igenom hela koden, och stängde porten efter att den hade skrivit till den, så då vart det knäppt när jag försökte öppna den på nytt. Ny kör jag med porten öppen hela tiden som en liten fullösning.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med COMPort på FriendlyARM

Inlägg av sodjan »

Du stängde säkert porten innan allt var skickat.

> efter att den hade skrivit till den,

Och "den" är säkert inte den fysiska porten utan någon buffert
som någon underliggande rutin sedan läser från. Det var sannolikt den
rutinen som du sparkade undan benen på genom att stänga porten.

> Av någon konstig anledning så körde den aldrig igenom hela koden,

Det var nog du som inte lät den göra det helt enkelt.

> Ny kör jag med porten öppen hela tiden som en liten fullösning.

Är det något annat problem med det ? Varför är det en "fullösning" ?
Användarvisningsbild
Gildebrand
Inlägg: 1108
Blev medlem: 8 maj 2009, 21:40:49
Ort: Falun

Re: Problem med COMPort på FriendlyARM

Inlägg av Gildebrand »

Jag tänker att det är en fullösning eftersom man har porten öppen hela tiden och aldrig stänger den, men det kanske inte gör något.
Jag var inne på det där med buffert ett tag, man tänkte inte på att .Net skulle ha en egen buffert, utan snarare att jag skulle skriva en egen.

Koden som jag körde för att skriva till porten såg ut såhär:

Kod: Markera allt

port.Open();
port.Write("Hello World!");
port.Close();
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med COMPort på FriendlyARM

Inlägg av sodjan »

> man tänkte inte på att .Net skulle ha en egen buffert,

Det vore mer förvånande om den *inte* buffrade data som ska sändas.
Det skulle vara ganska ineffektivt.

Från :
http://msdn.microsoft.com/en-us/library ... 00%29.aspx
The best practice for any application is to wait for some amount of time after calling the Close
method before attempting to call the Open method, as the port may not be closed instantly.
Se också (BytesToWrite property):
http://msdn.microsoft.com/en-us/library ... 00%29.aspx
Gets the number of bytes of data in the send buffer.
The send buffer includes the serial driver's send buffer as well as internal buffering in the SerialPort object itself.
Så länge som den inte är 0 så bör man nog inte göra Close på porten.

http://msdn.microsoft.com/en-us/library ... 00%29.aspx
Calling this method closes the SerialPort object and clears both the receive and transmit buffers.
Så allt finns ju där i klartext...

Om du nu *måste* stänga porten mellan varje skrivning så får du lägga en loop och vänta
på att BytesToWrite blir 0 innan du gör Close på den (porten).

Noera att jag aldrig har skrivit en enda rad i C# och jobbar inte med Microsoft produkter
alls normalt, men ändå tog det max 5 minuter att hitta allt.
Skriv svar