How do I send hex command as mmcorej.CharVector to serial port?

조회 수: 3 (최근 30일)
Maria M.
Maria M. 2017년 8월 11일
답변: Maria M. 2017년 8월 16일
Hi All,
I am trying to send a hex message to a light source connected by a usb through the virtual serial port. The source expects an up to 8 byte message, for example 'A9035301A95C' in order to change state. I am trying to communicate with it via Micro Manager adapter for Free Serial Port. Micro Manager command has the following format: setSerialPortCommand(String portLabel, String command, String term) where String command is java.lang.String command.
I tried various forms of the code below, but with no success. I would greatly appreciate any advice on the correct format for the command.
cheers, Maria
function [] = setBrightFieldManual(color,intensity)
global mmc;
comPortScopeLED = 'COM5';
presetColors = {'3000K','4500K','6500K','Red ','Green','Blue '}; % from manual
colorNumbers = {'01','02','03','04','05','06'};
colorMap = containers.Map(presetColors,colorNumbers);
intensityHEX = dec2hex(intensity);
checkSum = dec2hex(2^8-(81+hex2dec(colorMap(color))+intensity));
playPresetColorString = {'A9','04','4D',colorMap(color),intensityHEX,checkSum,'5C'};
setManualControllerLockoutON = {'A9','03','53','01','A9','5C'};
setUSBControl = {'A9','03','27','03','D3','5C'};
setManualControllerLockoutOFF = {'A9','03','53','00','AA','5C'};
getManualControllerLockout = {'A9','02','54','AA','5C'};
setAllShuttersOpen = {'A9','03','55','07','A1','5C'};
mmc.setSerialPortCommand(comPortScopeLED,'A9035301A95C',''); % also tried (comPortScopeLED,'setManualControllerLockoutON','')
mmc.setSerialPortCommand(comPortScopeLED,'A90254AA5C','');
answer=char(mmc.readFromSerialPort(comPortScopeLED));
disp(answer);
mmc.setSerialPortCommand(comPortScopeLED,'setUSBControl','');
mmc.setSerialPortCommand(comPortScopeLED,'setAllShuttersOpen','');
mmc.setSerialPortCommand(comPortScopeLED,'setManualControllerLockoutOFF','');

답변 (2개)

Walter Roberson
Walter Roberson 2017년 8월 11일
h2js = @(hexstring) java.lang.string( char(sscanf(hexstring, '%02x')) )
mmc.setSerialPortCommand(comPortScopeLED, h2js('A9035301A95C'), '');
That is, you need to convert the hex to bytes, and the bytes to java string.
  댓글 수: 1
Maria M.
Maria M. 2017년 8월 14일
편집: Maria M. 2017년 8월 15일
Hi Walter,
Thank you very much. The convertation which you suggested works, commands are being sent but device does not recognize them and does not switch the state. I am getting a reply in wrong format: A9034D. It looks like I used the wrong command. setSerialPortCommand sends data as java.lang.String, but I need to send binary data. The correct command for this is writeToSerialPort(String portLabel, CharVector data) but I am again facing the issue of correct convertation. CharVector is a java class from mmcorej package (<http://javadoc.imagej.net/Micro-Manager-Core/)>, which I import. I tried the code below and many other variations
setManualControllerLockoutON = {'A9','03','53','01', 'A9','5C'};
hex2jsVector = @(hexstring) mmcorej.CharVector(char(hex2dec(hexstring)));
mmc.writeToSerialPort(comPortScopeLED,hex2jsVector(setManualControllerLockoutON));
This code returns "No constructor 'mmcorej.CharVector' with matching signature found."
However, if I try to create an empty object, it works:
CharVecObjEmpty = javaObject('mmcorej.CharVector');
I would really appreciate any suggestions.
The following code works with fwrite command:
setManualControllerLockoutON = hex2dec({'A9','03','53','01', 'A9','5C'});
if exist ('s')
fclose (s)
delete (s)
clear s
end
s = serial ('COM5','BaudRate',115200);
fopen (s);
fwrite(s,setManualControllerLockoutON);
fclose (s)
Best, Maria

댓글을 달려면 로그인하십시오.


Maria M.
Maria M. 2017년 8월 16일
Problem solved. The correct command is writeToSerialPort. Here is working example (requires imported mmcorej):
setUSBControl = hex2dec({'A9','03','27','03','D3','5C'});;
ChVsetUSBControl = mmcorej.CharVector();
for k=1:length(setUSBControl)
ChVsetUSBControl.add(char(setUSBControl(k)));
end
mmc.writeToSerialPort(comPortScopeLED,ChVsetUSBControl);
pause(1);

카테고리

Help CenterFile Exchange에서 MATLAB에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by