<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/236640</link>
    <title>MATLAB Central Newsreader - reading from serial device</title>
    <description>Feed for thread: reading from serial device</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Fri, 26 Sep 2008 21:00:20 -0400</pubDate>
      <title>reading from serial device</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/236640#602427</link>
      <author>Dave Brackett</author>
      <description>Hi I have a custom made datalogger that I can access using Excel with VBA code using a USB-serial converter. &lt;br&gt;
&lt;br&gt;
I am trying to use matlab instead but am having difficulties as fopen(s) doesn't return anything. &lt;br&gt;
&lt;br&gt;
When running the serial('COM10') function the number of bytes available is 0. Should that be the case?  My settings for the port are correct apart from that I am unsure what the terminator is required to be. Do you think that would be causing the problem?&lt;br&gt;
&lt;br&gt;
The working VBA code is beneath the matlab code. sorry for the long post.&lt;br&gt;
&lt;br&gt;
function data_log()&lt;br&gt;
% Create a serial port object&lt;br&gt;
instrreset&lt;br&gt;
delete(instrfindall)&lt;br&gt;
s=serial('COM10','BaudRate',115200,'Parity','none','DataBits',8,'StopBits',1,'Terminator','LF/CR','TimeOut',5); % create serial object (port dependent)&lt;br&gt;
&lt;br&gt;
% Connect to the device&lt;br&gt;
fopen(s) % open the serial port for reading/writing&lt;br&gt;
&lt;br&gt;
% Set logging options&lt;br&gt;
no_samples=30;&lt;br&gt;
no_channels=1;&lt;br&gt;
current_sample=zeros(1,no_samples); % preallocation&lt;br&gt;
tic&lt;br&gt;
&lt;br&gt;
% Write and read data&lt;br&gt;
% 1) read data from the device and store in the input buffer&lt;br&gt;
for i=1:no_samples-1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;current_sample(i)=i;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(s,'%d',1);  % send a decimal 1 (not ascii code 1), prompts the logger to start sending data&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if i==1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer=[];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[in,count,msg]=fread(s);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer=buffer+in;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while length(buffer)&amp;lt;8 %checks when the number of bits in buffer =8&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for n=1:no_channels&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hi=buffer(j,j:j+1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lo=buffer(j+1,j+1:j+2);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% work out whether positive or negative number,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% if greater than 128 then its positive&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if hi&amp;lt;128&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adc_value=hi*256+lo;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adc_value=(65536-(hi*256+lo))*-1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=j+2;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% outputs as voltage&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;voltage_output(i)=round(adc_value/3276.8)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clear buffer&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sample_time=toc;&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% Disconnect and clean up&lt;br&gt;
fclose(s)&lt;br&gt;
delete(s)&lt;br&gt;
&lt;br&gt;
VBA Code that works:&lt;br&gt;
Sub Button10_Click()&lt;br&gt;
Dim buffer As String&lt;br&gt;
Dim rs As New MSComm&lt;br&gt;
Dim adc(4) As Variant&lt;br&gt;
&lt;br&gt;
Call Macro1 'clear worksheet&lt;br&gt;
Cells(2, 1) = &quot;scan&quot; 'create title&lt;br&gt;
Cells(2, 2) = &quot;Time&quot; 'create title&lt;br&gt;
For n = 3 To 6&lt;br&gt;
Cells(2, n) = &quot;ADC&quot; &amp; Str(n - 2) 'create title&lt;br&gt;
Next n&lt;br&gt;
&lt;br&gt;
rs.CommPort = 10 'port device is attached to&lt;br&gt;
rs.Settings = &quot;115200,n,8,1&quot; ' 1) Baud rate, 2) parity none, 3)no bits, 4)number of stop bits&lt;br&gt;
rs.InputLen = 0 'allows the buffer to continuously fill&lt;br&gt;
rs.PortOpen = True 'open the port&lt;br&gt;
&lt;br&gt;
t = Timer&lt;br&gt;
x$ = rs.Input 'x is a string, rs.Input is reading the serial COM port, effectively clearing the buffer&lt;br&gt;
&lt;br&gt;
For samps = 1 To Cells(1, 2) 'for samples 1 to maximum specified in cell(1,2) of sheet&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs.Output = Chr$(1) 'outputs the number '1' to the datalogger as trigger&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer = &quot;&quot; 'clears the string buffer&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Do&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DoEvents&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer = buffer + rs.Input&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Loop While Len(buffer) &amp;lt; 8 'checks when the no-bits =8&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Cells(samps + 2, 1) = samps 'current sample no&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Cells(samps + 2, 2) = Timer - t 'current time &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j = 1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For n = 1 To 4 'for all 4 channels&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hi = Asc(Mid(buffer, j, 1)) 'finding the jth digit +next digit&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lo = Asc(Mid(buffer, j + 1, 1))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If hi &amp;lt; 128 Then 'works out whether positive or negative number, if high is greater than 128 then its positive&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adc_value = hi * 256 + lo&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adc_value = (65536 - (hi * 256 + lo)) * -1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j = j + 2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Cells(samps + 2, n + 2) = Round(adc_value / 3276.8, 4) 'outputs voltage for chan 1 to third column in sheet&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next n 'carry on for next channel&lt;br&gt;
Next samps 'carry on for next sample&lt;br&gt;
&lt;br&gt;
rs.PortOpen = False 'close port&lt;br&gt;
&lt;br&gt;
End Sub</description>
    </item>
    <item>
      <pubDate>Sat, 27 Sep 2008 01:03:02 -0400</pubDate>
      <title>reading from serial device</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/236640#602450</link>
      <author>ehab ibrahim</author>
      <description>Hi dave&lt;br&gt;
&lt;br&gt;
I  had the same problems with the serial port&lt;br&gt;
&lt;br&gt;
my problem is that the matlab only sees the port (com10) just for one run&lt;br&gt;
and I have to close the matlab and open it again in order the matlab recognizes the port again.&lt;br&gt;
&lt;br&gt;
I didn`t figure out the problem, so if you figure it out please tell me, and this aslo applies on me.</description>
    </item>
    <item>
      <pubDate>Mon, 29 Sep 2008 14:49:25 -0400</pubDate>
      <title>Re: reading from serial device</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/236640#602772</link>
      <author>Trent Jarvi</author>
      <description>&lt;br&gt;
&quot;ehab ibrahim&quot; &amp;lt;ehabr9@yahoo.com&amp;gt; wrote in message &lt;br&gt;
news:gbk0o6$51b$1@fred.mathworks.com...&lt;br&gt;
&amp;gt; Hi dave&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; I  had the same problems with the serial port&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; my problem is that the matlab only sees the port (com10) just for one run&lt;br&gt;
&amp;gt; and I have to close the matlab and open it again in order the matlab &lt;br&gt;
&amp;gt; recognizes the port again.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; I didn`t figure out the problem, so if you figure it out please tell me, &lt;br&gt;
&amp;gt; and this aslo applies on me.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;&lt;br&gt;
&lt;br&gt;
Hi Ehab&lt;br&gt;
&lt;br&gt;
If you are using a traditional serial port, this should not be a problem. &lt;br&gt;
After you close the serial port in your M-script, make sure you delete the &lt;br&gt;
serial object.  To clean up even if you did not delete the serial port, you &lt;br&gt;
can do the following:&lt;br&gt;
&lt;br&gt;
delete(instrfindall)&lt;br&gt;
&lt;br&gt;
I know that some interfaces like bluetooth with serial like drivers can be &lt;br&gt;
problematic.  If the serial ports are vanishing and reappearing as &lt;br&gt;
connections are lost, You will run into the behavior your described.  Check &lt;br&gt;
to make sure you have the latest driver. </description>
    </item>
  </channel>
</rss>

