以前、MachiKaniaからPCへファイル転送するプログラムを作ってみました。
※ ここで紹介しているPC側の操作は Windows11です
この時は、PC側はTeraTermを使ってみましたが、ファイルを転送するだけでわざわざTeraTermをインストールしなくても、Windows なら PowerShell でシリアル通信できることが分かったので、PC側は PowerShell とし、ついでにMachiKania側のプログラムももう少し使い勝手のよいものに変更してみました。
また、PC側は PowerShellのスクリプトを batファイルから呼び出し、その batファイルをエクスプローラーの 「送る」 に設定することでPC側の操作性がアップしますのでその方法も紹介します。
まず、PCからMachiKaniaのファイルを送信するための、PC側のPowerShellスクリプト。
send.ps1
# --- ファイル名を引数から取得 ---
param(
[Parameter(Mandatory=$true)]
[string]$sendFile
)
# --- 設定 ---
$portName = "COM17"
$baudRate = 9600
#$sendFile = "TEST2.TXT"
$chunkSize = 64 # 一度に送るバイト数(調整可能)
# --- SerialPort オブジェクト作成 ---
$port = New-Object System.IO.Ports.SerialPort $portName, $baudRate, "None", 8, "One"
$port.Open()
Write-Host "Sending file: $sendFile"
# --- ファイル名を送信 ---
$port.Write($sendFile)
$port.Write("`r")
Start-Sleep -s 1
# --- ファイルをバイト配列として読み込み ---
$data = [System.IO.File]::ReadAllBytes($sendFile)
$total = $data.Length
$sent = 0
# --- 分割送信 ---
while ($sent -lt $total) {
$size = [Math]::Min($chunkSize, $total - $sent)
$port.Write($data, $sent, $size)
$sent += $size
Write-Host ("`rSent: {0}/{1} bytes" -f $sent, $total) -NoNewline
}
Write-Host "Send complete. ($total bytes)"
$port.Close()
ほとんど copilot に作ってもらいましたw
設定 の $portName は環境に合わせて変更してください。
この recv.ps1 を任意のフォルダに置いておきます。
私は、 C:¥ttl¥ に置きました。
そして、これを実行するための batファイル
MKファイル送信.bat
@echo off
rem カレントディレクトリを送信ファイルの場所に移動
cd /d %~dp1
rem PowerShellスクリプトを実行 (%~nx1 は引数指定したファイルのパスを除いたファイル名)
powershell -NoProfile -ExecutionPolicy Unrestricted -File "C:\ttl\send.ps1" "%~nx1"
pause
このファイル名は、エクスプローラーの「送る」で使うので、この例のように日本語で分かりやすいファイル名にしておくと良いです。
次に、この bat ファイルを、「送る」フォルダにおきます。
「送る」フォルダは、Windowsキー + R を押して「ファイル名を指定して実行」で shell:sendto と入れて [参照] ボタンをクリックすると表示されます。

そして、MachiKania で実行する受信プログラムは下記。
RCIVE.BAS
CLS
SERIAL 9600,0,1000
PRINT "END: ESC Key"
DO
A=SERIALIN()
IF INKEY()=27 THEN GOTO ENDP
IF A>=0 THEN
IF A=13 THEN BREAK
F$=F$+CHR$(A)
ENDIF
LOOP
CURSOR 0,0:PRINT "File name: ";:PRINT F$
FOPEN F$, "W"
WAIT 30:B=0:USETIMER 1000
DO
A=SERIALIN()
IF A>=O THEN
FPUTC A:B=B+1:TIMER 0
CURSOR 0,2:PRINT B;:PRINT " Bytes recived"
ENDIF
IF TIMER()>=3000 THEN BREAK
LOOP
FCLOSE
LABEL ENDP
END
PCからファイルを送信するには、まずこのプログラムをMachiKaniaで実行します。
すると、下記の画面になります。(ESCキーで中断)

次に、PC側のエクスプローラーで送りたいファイルを右クリック
「その他のオプションを確認」→「送る」→「MKファイル送信.bat」
を選択します。

すると黒い画面が表示されて転送が開始され、送信バイト数がカウントアップされ、送信が終了すると下記の表示になります。

MachiKania側もこのような画面になり、転送状況が分かります。
MachiKaniaのプログラムはTIMERを使って、データの受信が途絶えてから3秒経過すると終了するようにしています。

送信が終了すると、RCIVE.BAS と同じフォルダにPCから送信したファイルが転送されています。
PC側は、エクスプローラーでファイルを選択して「送る」という操作でファイルをMachiKaniaに送信することができるので、操作も直観的で簡単になりました。
特に複数のファイルをMachiKaniaに転送するときに便利だと思います。