2015-10-19 4 views
0

Я пытаюсь записать в последовательный порт с использованием кода в Matlab. Однако все, что я стараюсь, в первую очередь приводит к сообщению об ошибке, а затем заставляет Matlab думать, что порт недоступен.Проблема с записью на последовательный порт между Matlab и C с использованием mbed

код MATLAB, который я использую выглядит следующим образом:

function test() 

TIMEOUT = 5; %time to wait for data before aborting 
XPOINTS = 50; %number of points along x axis 

%create serial object to represent connection to mbed 
mbed = serial('COM18','BaudRate', 9600, 'DataBits', 8); %change depending on mbed configuration 

%set(mbed,'Timeout',TIMEOUT);  %adjust timeout to ensure fast response when mbed disconnected 

fopen(mbed);  %open serial connection 
input = 1; 
fprintf(mbed, input); 
x=0; 
while (x == 0)   
    values = fscanf(mbed, '%d'); 
    disp(values);  
end 

fclose(mbed); 

end 

сообщение об ошибке, которое появляется

Error using serial/fprintf (line 144) 
Error: An error occurred during writing. 

Error in test (line 14) 
fprintf(mbed, input); 

Моя главная проблема заключается в том, что из всего, что я могу найти в Интернете, кажется, скажем, что команда fprintf должна работать. Я также пробовал линию

fwrite(mbed, input); 

который приходит с по существу тем же сообщением об ошибке.

После того, как я попробовал этот раз следующее сообщение об ошибке, что я получаю это:

Error using serial/fopen (line 72) 
Open failed: Port: COM18 is not available. Available ports: COM1. 
Use INSTRFIND to determine if other instrument objects are connected to the requested device. 

Error in test (line 12) 
fopen(mbed);  %open serial connection 

Что я могу показаться только исправить, сохранив свою программу, а затем открыть точно такой же. К моменту попытки mbed определенно подключен к правильному COM-порту.

Мой вопрос: где я ошибаюсь в строке fprintf? Это правильный способ общения с последовательным портом или mbed?

+1

«Используйте INSTRFIND, чтобы определить, подключены ли другие приборы к запрашиваемому устройству». Вы на самом деле пытались это сделать? Поскольку вы не закрыли старый объект последовательного порта, оборудование уже используется. –

+0

У меня нет, я пойду и правильно использую это спасибо. Вероятно, это вызывает вторую ошибку. –

ответ

0

Проблема была решена путем добавления следующего к линии, которая пыталась изначально писать код:

Старая линия:

fprintf(mbed,input); 

Новая линия:

fprintf(mbed, '1', 'async'); 

I не знаю, почему это исправило это, но оно есть. Это может быть полезно для будущих людей, которые пытаются писать в mbed.

1

Там не очень много способов, которыми последовательный порт запись может выйти из строя:

  • Если последовательный порт исчез (например, отключив в USB-> последовательный адаптер)
  • Если буфер ядра от записи полный (вы написали огромное количество данных на более быстрыми темпами, чем это может вытекать из порта)
  • Если данные не вытекающий из порта на всех, из-за контроля потока, и тайм-аут истечет

Вам необходимо проверить параметры управления потоком, если ваше устройство не поддерживает RTS/CTS, но ваш код отключает аппаратное подтверждение связи, связь не удастся.

+0

Видя, как я знаю, что первые два не верны, или, по крайней мере, не так очевидно, я полагаю, что это третий.Как я могу прекратить этот контроль потока или истечет время ожидания? Спасибо за помощь. –

+1

@JackSchofield: попробуйте добавить «FlowControl», «none» после скорости передачи и параметров четности –