2015-02-02 5 views
0

У меня возникли проблемы с получением возвращаемых значений с моего телескопа. Я смог отправить данные, и я использую fscanf для получения возвращаемых значений, это мой код.с использованием matlab fscanf для телескопа nexstar

close all; clear all; clc; 
priorPorts = instrfind; % finds any existing Serial Ports in MATLAB 
delete(priorPorts); % and deletes them 
COMnum = input('COM Number:'); 
telescope = serial(['COM',num2str(COMnum)]); 
set(telescope,'BaudRate',9600); 
set(telescope,'Terminator','#'); %theres a pound symbol at the end of all commands 
fopen(telescope); 
fprintf(telescope,'h'); 
out = fscanf(telescope,'%c',512); 

, когда я запускаю это из возвращается в виде строки символов, которые я не могу интерпретировать (например, «9 O»). ожидаемый ответ:

chr(Q) & 
chr(R) & 
chr(S) & 
chr(T) & 
chr(U) & 
chr(V) & 
chr(W) & 
chr(X) & 
"#” 

, где Q, R, S, T, U, V, W, Х являются все целые числа, то "#" является терминатор. также, когда я ввожу команду, которая возвращает символ (целое число) & «#», он возвращает пробел и «#» терминатор. Примечание: эта программа работает, когда возвращаемое значение только строка текста то, что я пробовал:

  1. изменения% С до других типов, таких как% х
  2. исследующих сайт программирования Nexstar и тому предложения по устранению неполадок там, как с его в режиме слежения

Вот некоторые из ресурсов я использую http://www.nexstarsite.com/PCControl/ProgrammingNexStar.htm особенно документацию протокола Coms, который является первым звеном в верхней части. приветствуется всякая помощь. Спасибо!

+0

Я не читал весь документ в вашей ссылке, но это выглядит, как ваше оборудование посылает 'byte' (ы). Поэтому вам лучше читать 'uint8' из последовательного порта вместо' char'. (Используйте 'fread' вместо' fscanf'). Также похоже, что иногда телескоп посылает «старший байт, затем младший байт», поэтому, когда вы ожидаете такого ответа, прочитайте 2 байта, затем используйте «typecast» для восстановления 16-битных значений. – Hoki

+0

@Hoki i used 'fread (телескоп, телескоп.BytesAvailable,' uint8 ');' и иногда он возвращал целые числа, и иногда я получаю сообщение об ошибке «размер должен быть больше нуля», числа, которые он возвращает, различаются по размеру массива и не несущественны. – fluxD613

+0

«размер должен быть больше нуля» должен быть, потому что вы указываете 'размер' как' BytesAvailable'. Если в буфере телескопа нет байта, он возвращает 0 и ошибку. Вы должны проверить, есть ли 'BytesAvailable> 0', прежде чем пытаться прочитать. Размер возвращаемого массива байтов зависит от того, какую команду вы отправили на аппаратное обеспечение. Как интерпретировать этот байт подробно описано в вашей ссылке на протокол связи. – Hoki

ответ

0

Используйте fscanf затем приведение типа в два раза, как так

out = fscanf(s); 
out = double(out); 
Смежные вопросы