Hallo Fachleute ;-)
Einen Thread zu diesem Thema gibt es schon, der hat mir aber nicht
weitergeholfen. Also hier nochmal etwas detailierter.
Ich versuche nun seit einigen Tagen mit Visual Basic 6.0 einen über den
UART übertragenen Wert ordentlich zu empfangen bzw. anzuzeigen.
Vergebens!
Bei dem Wert handelt es sich um einen Rückgabewert (Integer) einer
Funktion welche das Temperatur-IC MAX6675 ausliest. Über den UART
verschicke ich zwei Byte hintereinander.
1 | int main(void)
|
2 | {
|
3 | unsigned int temperature;
|
4 |
|
5 | initavr();
|
6 | USART_Init(UBRR_VAL);
|
7 |
|
8 |
|
9 | while(1)
|
10 | {
|
11 | long_delay(3000);
|
12 | temperature = gettemp(); // Temperatur holen
|
13 | USART_Transmit(temperature >> 8);
|
14 | USART_Transmit(temperature);
|
15 |
|
16 |
|
17 | }
|
18 | }
|
Meine Idee war jetzt, ich versende diese zwei Bytes, lese sie in VB
einzeln aus. Zuerst das erste Byte, schiebe es 8 Bit nach links und dann
zweite Byte.
Das Problem:
Der Paramter RThreshold gibt an, nach wievielen empfangenen Zeichen das
ComReceive-Ereignis ausgelöst wird, InputLen gibt an wieviele Zeichen
aus dem Empfangspuffer eingelesen werden sollen.
Wenn in dem ersten Byte eine NULL drin steht, wird diese ,trotz des
Parameter NullDiscar = False, von VB aber ignoriert.
Setzte ich nun den Parameter InputLen = 2, wird nie ein Wert eingelesen
wenn das erste Byte eine NULL enthält, setzte ich InputLen = 1 wird
immer nur ein Byte eingelesen, sprich, wenn in dem ersten Byte keine
NULL drin steht, wird trotzdem nur eins eingelesen...
Setze ich InputLen = 0, wird zwar der ganze Eingangsbuffer eingelesen
(so kommts mir zumindest vor) allerdings kommt das VB nach einiger Zeit
aus dem Rythmus.
Das ist das erste Problem.
Das zweite Problem:
Ich versende die Temperatur direkt als String. Dann stehen je nach
gemessener Temperatur unterschiedlich viele Zeichen im Empfangspuffer.
Hier kann ich also auch keine feste InputLen setzen da die Zeichen ja je
nach Temperatur variieren. Somit kommt das VB wieder aus dem Rythmus.
Hier mal die Konfiguration des COM-Controls:
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputLen = 0
MSComm1.NullDiscard = False
MSComm1.PortOpen = True
Weiss jemand von euch wie man sowas am einfachsten proggen kann?
Danke schonmal im Voraus.