Re: Är det en loop som läser av värdet på COMporten?
Postat: 22 oktober 2014, 18:09:34
Googla på Xon & XoffAl_Bundy skrev:
Fram och tillbaka, fram och tillbaka...
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Googla på Xon & XoffAl_Bundy skrev:
Fram och tillbaka, fram och tillbaka...
Utveckla vidare. Handskakningen är till för kommunikation för att....?sodjan skrev:> Men kan man verkligen ha handskakning på USB som AVR:en kan kontrollera?
Hårdvaruhandskakning kan vara pyssligt.
Programvaruhandskakning är självklart inget som helst problem,
det är helt oberoende av hur "linjen" ser ut mellan de två parterna
och du har 100% kontroll i din egen kod över det.
> Handskakningen är väll till för att anropa/förvarna att något kommer och motsidan måste vara beredd?
Nej, det skulle jag inte säga. Det är som att ropa till någon och kasta en boll samtidigt
utan att kontrollera att mottagaran är beredd. Det är ingen handskakning. Du måste
vänta tills ("skaka hand" med) mottagaren faktiskt säger att han *är* beredd.
Kod: Markera allt
// denna metod måste anropas kontinuerligt för att ta emot data från porten.
// rekommenderas mellan 0.25 - 5 sekunders intervall beroende på behov.
public void Check_incoming()
{
if (connected > 0) connected--;
string text = port.Read();
if (text != null && text != "")
{
//Console.WriteLine(text);
// bearbeta inkommande text
char[] separator = { ':', ',', '*' };
// sträng-arrayen s innehåller alla argument i NMEA-meningen från 0="$IITXT" till checksumman
string[] s = text.Split(separator);
if (s.Length < 6) return; // error
connected = connection_timeout; // ställ timeout om meddelade kommer in
int start = 1;
string kommando = "";
if (s[0] == "$IITXT")
{
adress = toInt(s[1]);
code = toInt(s[3]);
checksum = toInt(s[s.Length - 1], 16);
start = 4;
kommando = s[start++];
}
switch (kommando)
{
case "v":
// läs in VV-parametrar
for (int i = 0; i < (VV.Length); i++)
{
if (i + start > s.Length) break;
VV[i] = toInt(s[i+start]);
}
VV_received = true;
numberOfCells = VV[20];
Console.WriteLine("VV received");
Console.WriteLine("Minibms {0} celler.", numberOfCells);
if (numberOfCells > MAXANTALCELLER) numberOfCells = MAXANTALCELLER;
if (numberOfCells < 0) numberOfCells = 0;
// skapa en cell-lista - behövs ej
break;
case "r":
// läs in celldata - millivolt
Vmedel = 0;
Vmax = 0;
Vmin = 10;
for (int i = 0; i < (numberOfCells); i++)
{
if (i + start > s.Length) break;
float v = toInt(s[i + start]) / 1000F;
celler[i].volt = v;
Console.Write("{0:0.000} ", v);
Vmedel += v;
if (v > Vmax) Vmax = v;
if (v < Vmin) Vmin = v;
}
totalVolt = (float)Math.Round(Vmedel, 1);
if (numberOfCells != 0)
Vmedel = Vmedel / numberOfCells;
Console.WriteLine("");
for (int i = 0; i < numberOfCells; i++)
{
celler[i].avvikelse = (celler[i].volt - Vmedel);
}
cellsUpdated = true;
break;
case "ta" :
// läs in temperaturer
break;
}
}
}
Kod: Markera allt
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace seriell
{
class Sercomm
{
// klassvariabler = Fält
const int MAXBUFLEN = 1024; // antal inlästa tecken
byte[] inbuf = new byte[MAXBUFLEN];
int bufpos = 0;
public SerialPort port = new SerialPort();
public string[] ports = SerialPort.GetPortNames();
// konstruktor - letar upp alla lediga portar och skriver ut en lista
public Sercomm ()
{
// Skriv ut en lista med portar
Console.WriteLine("Existerande portar:");
foreach(string pname in ports)
{
port.PortName = pname;
try
{
port.RtsEnable = false;
port.Open();
Console.WriteLine("Port {0} är ledig.", port.PortName);
//Console.WriteLine((port.CDHolding) ? "DCD on" : "DCD off");
//Console.WriteLine((port.CtsHolding) ? "CTS on" : "CTS off");
port.Close();
}
catch (System.IO.IOException)
{
// inget
}
catch (System.UnauthorizedAccessException)
{
Console.WriteLine("Port {0} är upptagen.", port.PortName);
}
}
}
public void Open(string portnamn, int baudrate)
{
port.PortName = portnamn;
port.BaudRate = baudrate;
port.ReadTimeout = SerialPort.InfiniteTimeout;
port.Open();
port.RtsEnable = true;
Console.WriteLine("Port {0} öppnad, {1} BAUD.", port.PortName, port.BaudRate);
Console.Beep(440, 200);
}
public string Read ()
{
int nrOfBytes = port.BytesToRead;
for (int i = 0; i < nrOfBytes; i++ )
{
byte tkn = (byte)port.ReadChar();
if (tkn != 0x0a)
{
inbuf[bufpos++] = tkn;
if (bufpos >= MAXBUFLEN)
{
bufpos = 0;
return "";
}
if (tkn == 0x0d)
{
string textrad = "";
for (int j = 0; j < bufpos; j++)
{
char z = (char) inbuf[j];
textrad += z;
}
bufpos = 0;
return textrad;
}
//Console.Write(tkn);
}
}
return null;
}
public void Write (string text)
{
port.Write(text);
}
public void Close ()
{
// stäng porten
if (port.IsOpen)
{
port.Close();
Console.WriteLine("Port {0} stängd.", port.PortName);
Console.Beep(220, 200);
}
}
public void printBuff ()
{
for (int i = 0; i < bufpos; i++)
{
byte z = inbuf[i];
if (z > 31)
Console.Write((char)z);
//Console.Write("[{0:X}]", z);
//Console.Write(BitConverter.ToString(inbuf).Replace("-00",""));
}
Console.WriteLine("");
}
}
}
Kod: Markera allt
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <termios.h>
#define PATH "C:\\Documents and Settings\\Admin\\Mina dokument\\Avancerat\\ekg\\"
#define COMPORT "COM1"
#define UTFIL "bms_logg.txt"
FILE *s, *s1, *utfil;
char input[256];
int main() {
char ch;
printf("testar att kommunicera med serieporten\n");
printf("sizeof char = %i\n", sizeof(char));
printf("sizeof int = %i\n", sizeof(int));
printf("sizeof short int = %i\n", sizeof(short int));
printf("sizeof double = %i\n", sizeof(double));
if ((s = fopen(COMPORT, "r+b")) == NULL) {
printf ("Port OPEN error: ");
printf( COMPORT );
return 0;
}
printf("\n----- " COMPORT " open ------\n");
system( "mode com1: baud=38400 parity=n data=8 stop=1" ) ;
while (1) {
ch = fgetc(s); // ( input, sizeof( input ), s) ;
printf( "%c", ch ) ;
if (ch == '0') {
fprintf(s,"\n\r");
}
}
fclose(s);
printf("\nklart!");
return 0;
}
Bundy är representativ för den moderna ingenjörsarbetskraft Svenska storföretag har att tillgå, är det så konstigt att allt mer av utveckling och produktion hamnar utomlands istället? Läsa på och tänka själv är för jobbigt, bättre att gissa, chansa, plagiera och sitta i möten och allmänblaja iställetsodjan skrev:> Utveckla vidare. Handskakningen är till för kommunikation för att....?
OK, jag måste försöka skita i denna tråd...
Antingen driver du med alla eller så är du hopplöst obildbar.
Bör väl snarare vara:Nerre skrev:Ja, istället för att ta reda på själv så frågar man nån som man tror vet...