Matrisberäkningar med för STM32?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Matrisberäkningar med för STM32?

Inlägg av Krille Krokodil »

Nätet kryllar av färdiga kodexempel att titta på:

Real time Data plot from serial port
https://se.mathworks.com/matlabcentral/ ... erial-port

Arduino Realtime graph plot using Matlab


Plotting Live Data of a Temperature Sensor using Arduino and MATLAB
https://se.mathworks.com/videos/plottin ... 21317.html

USB Interfacing and Real Time Data Plotting with MATLAB
https://ashrafi.sdsu.edu/PDF/matlabUSBReport.pdf

Real Time Data Graphing 921600 baud UDP
https://se.mathworks.com/matlabcentral/ ... 0-baud-udp
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Matrisberäkningar med för STM32?

Inlägg av Krille Krokodil »

Och istället för att ägna veckor åt att skriva egna hjul så kan man ju *trumvirvel* använda standardfunktionerna
för att processa strängar i Matlab, C/C++, Java...

"%Convert to an array of numbers
dataNum = sscanf(dataStr, '%d,%d,%d,%d,%d,%d', bytesToRead);"
Shimonu
Inlägg: 294
Blev medlem: 21 oktober 2015, 22:44:33

Re: Matrisberäkningar med för STM32?

Inlägg av Shimonu »

Al_Bundy skrev:Det är mycket möjligt att skicka "Hej" så kommer "Hej" fram. Men tänk om du har en uC som bara sprutar ut "Hej" i 500 gånger per sekund. Så fort du ska läsa "Hej" så blir det "HejHejHejHejHejHejHejHej".
Du väljer istället att skicka "Hej\n" och nu har du massa
Hej
Hej
Hej
Hej
Hej
Hej
Hej

Lägg till lite problem också
He
j

Hej
Hej
He
H
HejHej
HejHejHej

Hej



Låt oss säga att du vill skicka "X,Y,Z,O,P" Då måste du dela upp varje text med ",". Detta blir lite forloopar för att dela upp en text till olika värden.
Jag anser att det blir mer bökigt att jobba med strängar om man ska skicka data mellan olika enheter.

Det var ju detta som många här i tråden ansåg att det är bättre att man bittlanga istället.
Återigen, det här är problem som beror på din implementation och behöver inte alls bli som du säger.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Klart den bygger på min implementation. Jag har inte sagt något annat. Men jag har mer kontroll, personligen, av det jag skickar om jag skickar igenom att använda bitoperationer :)
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Krille Krokodil skrev:Och istället för att ägna veckor åt att skriva egna hjul så kan man ju *trumvirvel* använda standardfunktionerna
för att processa strängar i Matlab, C/C++, Java...

"%Convert to an array of numbers
dataNum = sscanf(dataStr, '%d,%d,%d,%d,%d,%d', bytesToRead);"
Nu blir det inge MATLAB här :)

Det kommer bli Java för Android/Iphone applikationer som kommunicerar med C via Modbus.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4689
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Swech »

Al_Bundy skrev:Så här ser min implementering ut för att skicka ett tal som är mellan 0 till under 65536.

Skicka C-kod

Kod: Markera allt

/*
			 * adc is beteen 0 to 4095
			 */
			int adc = adcValues[0]; // We store adcValues[i] into a temporary array due to changes of adcValues

			/*
			 * Send
			 */
			uint8_t data = (uint8_t) (adc >> 8); // First data
			HAL_UART_Transmit(&huart2, &data, sizeof(data), TIME_OUT);
			data = (uint8_t) (adc & 0xFF); // Second data
			HAL_UART_Transmit(&huart2, &data, sizeof(data), TIME_OUT);
			HAL_Delay(10);
Ta emot C-kod

Kod: Markera allt

while (1) {
		memset(stm32->readBuffer, '\0', sizeof(stm32->readBuffer));

		/*
		 * Flush
		 */
		tcflush(stm32->serialPort, TCIFLUSH); // Get the latest values

		/*
		 * Collect bytes until the ACK is comming
		 */
		int receiveBytes = read(stm32->serialPort, stm32->readBuffer,
				sizeof(stm32->readBuffer));

		/*
		 * Print
		 */
		int count = 0;
		int adc = 0;
		for (int i = 0; i < receiveBytes; i++) {

			if (count == 0) {
				adc = (int) stm32->readBuffer[i] * 256;
				count++;
			} else if (count == 1) {
				adc += (int) stm32->readBuffer[i];
				count = 0;
				printf("value %d\n", adc);
				stm32->adc = adc; // save the  latest
				adc = 0;
			}

		}

		/*
		 * receiveBytes is the number of bytes read. receiveBytes may be 0 if no bytes were received, and can also be -1 to signal an error.
		 */
		if (receiveBytes < 0) {
			printf("Error reading: %s", strerror(errno));
		}
	}
Är vi överens om jag säger att din rutin som skickar 0-65535 alltid skickar två bytes och att dessa kan vara allt mellan 0 och 255.
Är vi också överens om att din rutin endast skickar två bytes.
ACK som du snackar om skickas alltså inte utan mottagande enhet antar att om det inte kommer tecken inom rimlig tid så är sändningen klar.

Vi har om vi är överens då ett system som spottar ut två tal mellan 0 och 255 och därefter tystnar.

Mottagande enhet väntar på att den interna C rutinen skall spotta ut ett antal bytes baserat på när den tycker att sändande enhet har skickat klart.
Är vi överens om detta också?

Hur kommer det sig då att mottagande enhet inte indikerar att ett udda antal mottagna tecken måste innebära att något gått fel ?
T.ex. du skickar 14 och 62 motsvarar 14*256 + 62 = 3646
men om vi antar att det slinker in en 0 i överföringen så du får 14 0 62 istället
Då får du 14*256 + 0 = 3584 och 62 kastas bort

Om man skickar data i textform så får man följande fördelar.
Varje byte som kommer skall vara mellan ascii '0' och ascii '9' eller några få specialtecken som man kan definiera.
Alla övriga tecken är felaktiga. Upptäcks direkt.

När man felsöker går det att titta på data i ett terminalprogram och läsa direkt. Sparar många timmars felsökning.

Specialtecken så som slut på data, komma, ny data skiljer sig då från dina andra mätvärden och kan inte förekomma i "rådatan" eftersom den alltid är i ascii "0-9"


Swech
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Swech skrev: Är vi överens om jag säger att din rutin som skickar 0-65535 alltid skickar två bytes och att dessa kan vara allt mellan 0 och 255.
Ja.
Är vi också överens om att din rutin endast skickar två bytes.
Ja.
ACK som du snackar om skickas alltså inte utan mottagande enhet antar att om det inte kommer tecken inom rimlig tid så är sändningen klar.
Jag tog bort ACK och lade till en fördröjning på 10 uS.
Vi har om vi är överens då ett system som spottar ut två tal mellan 0 och 255 och därefter tystnar.
Inte tystnar. Den fortsätter skicka.
Mottagande enhet väntar på att den interna C rutinen skall spotta ut ett antal bytes baserat på när den tycker att sändande enhet har skickat klart.
Är vi överens om detta också?
Den väntar inte. När STM32 skickar så gör den det hela tiden. Sedan så plockar mitt C-program upp dessa värden.
Hur kommer det sig då att mottagande enhet inte indikerar att ett udda antal mottagna tecken måste innebära att något gått fel ?
T.ex. du skickar 14 och 62 motsvarar 14*256 + 62 = 3646
men om vi antar att det slinker in en 0 i överföringen så du får 14 0 62 istället
Då får du 14*256 + 0 = 3584 och 62 kastas bort
Lade till en fördröjning och nu är allt i sin ordning :)
Om man skickar data i textform så får man följande fördelar.
Varje byte som kommer skall vara mellan ascii '0' och ascii '9' eller några få specialtecken som man kan definiera.
Alla övriga tecken är felaktiga. Upptäcks direkt.
Jag säger inte att det är fel att skicka text. Jag skickade text -> hade inte koll -> någon rekommenderade att bitlanga -> testade det och det fungerade -> Bundy glad.
När man felsöker går det att titta på data i ett terminalprogram och läsa direkt. Sparar många timmars felsökning.
Jo. Men nu var det någon här i tråden som sade att ASCII är endast för felsökning och bästa är att man bitlangar och därmed är det bättre.

Min lärare har alltid förespråkat att man skickar bit istället för ASCII-tecken för tecken.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av sodjan »

> som sade att ASCII är endast för felsökning...

Citera eller länka till det!

> att man skickar bit istället för ASCII-tecken

Väldigt tveksamt om han faktiskt sa just så.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

svanted skrev: min åsikt är att ASCII i protokoll via en socket är bra att använda då man kan simulera sändare och mottagare med vanlig telnet för felsökning och utveckling, detta när det gäller att överföra enkla mätdata, typ några kb/s, har omvandlingstider ingen som helst betydelse.
Nu var det alltså en åsikt. Vi ska inte hänga någon för detta. OK?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av sodjan »

OK, men det var (som vanligt) inte vad du skrev.
Det som skrivs i citatet är att det (även) är praktiskt vid
felsökning och tester. Inte att det "enbart är för felsökning".
Men det är ju i linje med alla dina andra (miss-)tolkningar
av det mesta som skrivs här...
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Jag kan ju använda ASCII tabellen för att torka bort olja från oljetråget. Eller så kan jag vika pappersflygplan med den.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Så här ser det ut i Java för att läsa 8-bit värden som skickas via socket. Ja koden fungerar.

Det är för Android som ska tala med ett C program på min PC. :)
Någon som vill komma igång med Android/Iphone appar? Jag kan förklara lite enkelt hur. Gluon!

Kod: Markera allt

package com.gluonapplication.thread;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;


public class SocketConnection {
	private static Socket socket;
	private static String ip = "127.0.0.1";
	private static int port = 5000;
	private static String message;
	private static DataInputStream in;
	private static DataOutputStream out;
	private static int[] readBuffer = new int[256];
	
	/*
	 * This will connect to the server
	 */
	public void connectionServer(){
		try {
			socket = new Socket(ip, port);
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
            
		} catch (Exception e) {
			message = e.getMessage();
		}
	}
	
	/*
	 * This will send an int array
	 */
	public void sendData() {
		
	}
	
	/*
	 * This will receive an int array
	 */
	public void receiveData() {
		try {
			/*
			 * Read all 8-bit values
			 */
			int i = 0;
			while(in.available() > 0) {
				int b = in.read();
				readBuffer[i] = b; 
				i++;
			}
			
			for(int j = 0; j < i; j++) {
				System.out.println(readBuffer[j]);
			}
			
		} catch (Exception e) {
			message = e.getMessage();
		}
	}
}
Så om jag skickar detta via C

Kod: Markera allt

int hello[5] = {65, 23,123, 21,34};
write(new_socket , hello , sizeof(hello));
Då visar Java
65
0
0
0
23
0
0
0
123
0
0
0
21
0
0
0
34
0
0
0
Snyggt att den avgränsar med 000. Men misstänker att det har med sizeof att göra. Varje int är ju 4 bytes i mitt fall.
Rick81
Inlägg: 746
Blev medlem: 30 december 2005, 13:07:09

Re: Matrisberäkningar med för STM32?

Inlägg av Rick81 »

Och varför tror du det är 4 bytes per int? Det är inte för att avgränsa med 0

Och har du testat skicka text kommer du se att det faktiskt funkar att skicka text.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Jag tror i detta fall så ska jag skicka ASCII kod typ 53 54 55 vilket betyder 567. Jag ska ju göra det från Java.

Snart klar med min adaptiva regulator. Ett företag har redan varit intresserad av mina idéer och vill att jag ska hälsa på.
Användarvisningsbild
AndLi
Inlägg: 17042
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av AndLi »

53 54 55 är värdena som motsvarar '5' '6' '7' i ascii tabellen. Anger man de istället i hex blir det direkt mycket tydligare vilka tecken de motsvarar (0x35,0x36,0x37)

>Jag ska ju göra det från Java.
Vad har val av språk för påverkan menar du?
Skriv svar