Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
8 years, 7 months ago.
Direct Serial Output on Terminal != Serial read from mbed with output generation on Terminal
Dear mbed community,
I have a device denoted as "impact" generating a series of ASCII characters through Serial Comms port. As an example, the output format looks something like "ddd.ddm" where ddd.ddx are the reading and x is a fixed character.
When the device is connected to a serial to usb converter and the viewed in Terminal, it is showing the right results.
As soon read I read it using another mbed device and dump the data onto the Terminal the output appears to be displaced.
I have checked the baud rate, data bits, parity, stop bits between "impact", mbed and Terminal and they are all synced.
I need advice and suggestion how can this be done in the most appropriate way.
Also, note that the incorrect message is always consistent, perhaps I am not reading the data correctly?
The code that I am using is the most elementary as following:
#include "mbed.h"
Serial pc(USBTX, USBRX, 9600); // tx, rx
Serial impact(p13, p14, 9600);
DigitalOut my_led1(LED1), my_led2(LED2);
int main() {
pc.format(8, Serial::None, 1);
impact.format(8, Serial::None, 1);
while(1){
while(impact.readable()){
pc.putc((char)impact.getc());
my_led2 =! my_led2;
}
}
}
1 Answer
8 years, 7 months ago.
Hello Hua,
Try to use a serial interrupt service routine as follows:
#include "mbed.h"
Serial pc(USBTX, USBRX, 9600); // tx, rx
Serial impact(p13, p14, 9600);
//When using RTOS it's more safe to use RawSerial in ISR than Serial
//RawSerial pc(USBTX, USBRX, 9600); // tx, rx
//RawSerial impact(p13, p14, 9600);
DigitalOut my_led1(LED1), my_led2(LED2);
void onImpactReceived(void)
{
while(impact.readable()) {
pc.putc((char)impact.getc());
my_led2 = !my_led2;
}
my_led2 = 0;
}
int main()
{
pc.format(8, Serial::None, 1);
impact.format(8, Serial::None, 1);
impact.attach(&onImpactReceived);
while(1) {
my_led1 =! my_led1;
wait_ms(500);
}
}