Serial Communication Error on Teensy 3.0 -- Com Port Closes After Read/Write Failure

Status
Not open for further replies.

S.Holmes

New member
I am trying to talk to my Teensy using serial commands, but after several successful queries and responses, I see a Write Error, and then the Port can't be opened until I physically disconnect and reconnect the USB cable.

This behavior occurs on Windows 7 both through the Arduino serial monitor and through a putty session with the Teensy's port, as captured in the pictures below. Occasionally I can repon the serial monitor or putty session after the error without getting a com port error, but it disappears often enough that it's a problem.

arduino error.jpgarduino error 2.jpgputty error.jpgputty error 2.jpg

It also happens on ubuntu 12.04 when I use the screen command (screen /dev/ttyACM0 9600) in a terminal session; I query the Teensy and get a response several times, but eventually the screen session terminates right after I send a query (displays [screen is terminating]). I don't get a "com port error" on this OS -- I can use the screen command again without reconnecting the cord.

I've pared my code down to an edited version of the mac address program in this post: http://forum.pjrc.com/threads/91-teensy-3-MAC-address . My version, which I will attach to this post, edits the main loop to wait for a query from the user (a "?") before printing out the mac address. Eventually I will be interfacing with the Teensy through pyserial, and will be using this query/response technique for a variety of functions. I've narrowed down this problematic behavior to this simple code though, so I'd like to debug this first.

Other information:
This behavior occurs on multiple Teensy boards.
If I have my device manager on Windows open when the write error occurs, I can see it (the device manager) refresh, which indicates that the com port has closed/disappeared. However, the Teensy is still visible on the same com port in the device manager list -- but I still can't talk to it without reconnecting the cable.

This is my first project using Teensy, and I'd appreciate any help or advice. Is it a timing issue, or does it have to do with the transmit buffering on the Teensy's side? Thanks in advance!
 

Attachments

  • mac.cpp
    932 bytes · Views: 207
  • mac.h
    83 bytes · Views: 215
  • mac_query.ino
    512 bytes · Views: 207
After further investigation, it looks to be an issue with the mac address code.

I hooked up an FTDI USB TTL Serial cable and used the UART example code on this page: https://www.pjrc.com/teensy/td_uart.html . This works perfectly, through both the regular USB cable (using Serial) and through the UART (using Serial1/HWSerial in that code).

However, when I try to combine the Serial1 functionality with the mac address code, I see the same issue, where the Teensy seems to disappear and fails to respond.

I am stepping through the mac code now, but would appreciate other people taking a look. I attached it above, but here it is again, in case you don't feel like downloading it. It's from this post: http://forum.pjrc.com/threads/91-teensy-3-MAC-address

mac_query.ino:
Code:
#include "mac.h"

int SWVersion = 1020;

void setup() {
  delay(1000);
  Serial.begin(9600);
  
//  Serial.println("Reading MAC from hardware...");
//  read_mac();
//  
//  Serial.print("MAC: ");
//  print_mac();
//  Serial.println();
//  
//  Serial.print("Finished.");
}

void loop() {
  
  if (Serial.available()){
    int inbyte;
    
    inbyte = Serial.read();
    
    if (inbyte == '?'){
      Serial.println(SWVersion);
      read_mac();
      print_mac();
      Serial.println();
    }
    
  }
  
}

mac.cpp:
Code:
#include "mac.h"

uint8_t mac[6];

// http://forum.pjrc.com/threads/91-teensy-3-MAC-address
void read(uint8_t word, uint8_t *mac, uint8_t offset) {
  FTFL_FCCOB0 = 0x41;             // Selects the READONCE command
  FTFL_FCCOB1 = word;             // read the given word of read once area

  // launch command and wait until complete
  FTFL_FSTAT = FTFL_FSTAT_CCIF;
  while(!(FTFL_FSTAT & FTFL_FSTAT_CCIF));

  *(mac+offset) =   FTFL_FCCOB5;       // collect only the top three bytes,
  *(mac+offset+1) = FTFL_FCCOB6;       // in the right orientation (big endian).
  *(mac+offset+2) = FTFL_FCCOB7;       // Skip FTFL_FCCOB4 as it's always 0.
}

void read_mac() {
  read(0xe,mac,0);
  read(0xf,mac,3);
}

void print_mac()  {
  size_t count = 0;
  for(uint8_t i = 0; i < 6; ++i) {
    if (i!=0) count += Serial.print(":");
    count += Serial.print((*(mac+i) & 0xF0) >> 4, 16);
    count += Serial.print(*(mac+i) & 0x0F, 16);
  }
}

mac.h:
Code:
#include <Arduino.h>;

extern uint8_t mac[6];

void read_mac();
void print_mac();

To use a USB to Serial cable like mine, change Serial to Serial1 (or whichever port you're using) in the code.

I've also tried baud rates of 9600 and 115200, with the same results all around.

Thanks for your help!
 
Status
Not open for further replies.
Back
Top