Message for OBC
Dr_Acula
Posts: 5,484
Message for OBC as too big to fit in the PM
This vb.net v 2008.
Declare this right at the beginning of the program
Imports System.IO.Ports
Imports Strings = Microsoft.VisualBasic ' so can use things like left( and right( for strings
and then this is the subroutine. Delay value of 50 seems about right.
This vb.net v 2008.
Declare this right at the beginning of the program
Imports System.IO.Ports
Imports Strings = Microsoft.VisualBasic ' so can use things like left( and right( for strings
and then this is the subroutine. Delay value of 50 seems about right.
Sub XModemKyeSend(ByRef FName As String, ByVal Delay1 As Integer) Dim Filenamepath As String Dim a, j, i As Integer Dim k As Integer Dim LineOfText As String Dim SerialString As String Dim Counter As Integer Dim ErrorString As String Dim Packetnumber As Integer Dim Checksum As Long Dim OnesComplement As Byte Dim ByteRead As Byte Dim BinaryFileLength As Long Dim BinaryFileCounter As Long Dim Percent As Single Dim ErrorCounter As Byte ' 0 to 10 Dim CPMFilename As String Dim Timeout As Boolean ProgressBar1.Maximum = 100 ProgressBar1.Minimum = 0 ' timer restart =true for sending via menu. False for auto send Filenamepath = FName Packetnumber = 1 ' 1 for the first packet (not zero) ' Try Dim Input As New FileStream(Filenamepath, FileMode.Open, FileAccess.Read) Dim br As New BinaryReader(Input) OpenSerialPort() ' open the serial port Label3.Text = "Error Count" Label2.Text = "0%" BinaryFileLength = br.BaseStream.Length() - 1 'i = Len(Filepath) + 1 + 1 ' eg c:\n8vem and a \ = 9 and 1 more for start of name only Call Get_CPM_Filename(Filenamepath, CPMFilename) CPMFilename = Strings.UCase(CPMFilename) LineOfText = "XMODEM R " + CPMFilename + vbCr Call StringToPacket(LineOfText) ' Call ClearInputBuffer() ' clear the buffer into the PC For i = 1 To Delay1 ' 50 for kyedos need to wait for kyedos to run the xmodem program Sleep(100) ' wait for the xmodem text to come back so the next one is a 21 Label3.Text = Str$(i) Call ClearInputBuffer() ' clear the buffer into the PC Next i Call ClearInputBuffer() ' clear the buffer into the PC Do SerialString = "" If SerialPortFound = True Then If SerialPortName.BytesToRead > 0 Then SerialPortName.Read(InPacket, 0, 1) ' get one byte SerialString = Chr(InPacket(0)) ' get a single character/string/byte End If End If If InPacket(0) = 21 Then ErrorString = "NAK" Exit Do ' got a ^U End If If SerialString <> "" Then 'LineOfText = SerialString 'Call TextLines(LineOfText) ' print it out unless it is a chr21 End If Counter = Counter + 10 Sleep(10) ' don't change this one - this is waiting for NAK Label1.Text = "Waiting for NAK to start" + Strings.Str(Counter) + "ms" ' display in milliseconds System.Windows.Forms.Application.DoEvents() ' update the label1 message ' add a counter and timeout if nothing If Counter > 5000 Then ErrorString = "Bypass wait for NAK - xmodem failed" Exit Do End If If ErrorString <> "" Then Exit Do Loop Label1.Text = ErrorString System.Windows.Forms.Application.DoEvents() ' update the label1 message Do ' act on each byte in the buffer array here XOut(0) = 1 'SOH ^A XOut(1) = Packetnumber OnesComplement = 255 - Packetnumber XOut(2) = OnesComplement Packetnumber = Packetnumber + 1 If Packetnumber > 255 Then Packetnumber = Packetnumber - 256 Checksum = 0 For i = 0 To 127 ' get 128 bytes from file If BinaryFileCounter <= BinaryFileLength Then ByteRead = br.ReadByte ' get a byte Else ByteRead = 26 ' pad with char 26 = hex 1A because hyperterm does this ? why but it works End If XOut(i + 3) = ByteRead Checksum = Checksum + ByteRead BinaryFileCounter = BinaryFileCounter + 1 Next ' create checksum Do If Checksum < 256 Then Exit Do ' work out checksum Checksum = Checksum - 256 Loop XOut(131) = Checksum Call OutputXout() System.Windows.Forms.Application.DoEvents() ' update the label Timeout = False Do k = 0 Do If SerialPortFound = True Then j = SerialPortName.BytesToRead End If If j >= 1 Then If SerialPortFound = True Then SerialPortName.Read(InPacket, 0, 1) ' get one byte End If Exit Do End If k += 1 If k > 5000 Then Timeout = True ' 5 second delay for timeout, must be more than the Rx side timeout Exit Do End If Sleep(1) ' 1ms delay Loop If InPacket(0) = 6 Then Exit Do ' remote got the packet so exit If InPacket(0) = 21 Then ' remote didn't get it so try sending again - does up to 10x ErrorCounter = ErrorCounter + 1 Call ClearInputBuffer() ' clear the input buffer to the PC Sleep(1000) ' let the remote get itself sorted before resending the packet Call OutputXout() ' resend the packet Label3.Text = "Nak: " + Strings.Str(ErrorCounter) System.Windows.Forms.Application.DoEvents() ' update the label End If If Timeout = True Then Label3.Text = "Timeout waiting for Ack" ErrorCounter = 20 'force an exit now System.Windows.Forms.Application.DoEvents() ' update the label End If If ErrorCounter >= 10 Then Exit Do ' more than 10 errors Loop If ErrorCounter >= 10 Then Label1.Text = "10 or more errors - aborting" Label2.Text = "0%" OutPacket(0) = 24 ' send a ^X cancel If SerialPortFound = True Then SerialPortName.Write(OutPacket, 0, 1) ' send 1 byte OutPacket(0) = 3 ' send a ^C SerialPortName.Write(OutPacket, 0, 1) ' send 1 byte End If Exit Do End If If BinaryFileCounter > BinaryFileLength Then Exit Do ' finish up Label1.Text = "Sent packet: " + Strings.Str(Packetnumber) + " = OK" Percent = BinaryFileCounter / BinaryFileLength Percent = Percent * 100 Percent = Int(Percent) Label2.Text = Strings.Str(Percent) + "%" ProgressBar1.Value = Percent Loop If ErrorCounter < 10 Then OutPacket(0) = 4 ' finish byte If SerialPortFound = True Then SerialPortName.Write(OutPacket, 0, 1) ' send 1 byte End If Label2.Text = "100%" Label1.Text = "Finished" ProgressBar1.Value = 0 'done Call StringToPacket(vbCrLf) ' back to kyedos End If Input.Close() Sleep(200) ' wait for next file System.Windows.Forms.Application.DoEvents() ' update the labels 'Catch ex As Exception ' Close() ' Label1.Text = Filenamepath + " not found" ' System.Windows.Forms.Application.DoEvents() ' update the labels ' Sleep(1000) ' so time to read message 'End Try SerialPortName.Close() ' close the serial port End Sub
Oldbitcollector (Jeff) wrote:Would you be kind enough to share what you are using on the PC end for Xmodem file transfer to Kyedos? Sounds like you've got a snappy little VB program created to make things easy. (Still fighting with Hyperterm here.)
Thanks
Jeff
Comments
I'm having trouble getting this to compile with the tools I have.
Thanks
Jeff
It may not compile with 2010 - I'm using 2008. But it should be possible to port things over.
.net files are created in a directory with multiple sub directories but it should unzip with all that directory structure intact and hopefully the .sln file will open it.
-Jeff