シリアル通信プログラム

Public Class SerialCommunication
    Dim TempStr As String ' 一時文字列

    Private Sub SerialCommunication_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With SerialPort1
            .PortName = "COM1"
            .BaudRate = 1200
            .DataBits = 8
            .Parity = IO.Ports.Parity.None
            .StopBits = IO.Ports.StopBits.One
            .ReceivedBytesThreshold = 1
        End With

    End Sub

    Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        Dim value As Char
        Dim str As String
        value = e.KeyChar

        If value = vbCr Then
            str = TextBox1.Text.ToUpper() + vbCr
            If SerialPort1.IsOpen Then
                SerialPort1.Write(str)
            End If
            TextBox1.SelectAll()
        End If
    End Sub

    Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click
        If SerialPort1.IsOpen = False Then
            Try
                SerialPort1.Open()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "エラー", _
                    MessageBoxButtons.OK, _
                    MessageBoxIcon.Error, _
                    MessageBoxDefaultButton.Button3)
            End Try
        Else
            MessageBox.Show("既にシリアルポートを開いています。", "エラー", _
                MessageBoxButtons.OK, _
                MessageBoxIcon.Warning, _
                MessageBoxDefaultButton.Button3)

        End If
    End Sub

    Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
        If SerialPort1.IsOpen = True Then
            SerialPort1.Close()
        End If
    End Sub

    Private Sub SerialCommunication_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        If SerialPort1.IsOpen = True Then
            SerialPort1.Close()
        End If
    End Sub

    Delegate Sub RecvDataDelegate(ByVal RecvStr As String)

    Private Sub RecvData(ByVal RecvStr As String)
        ' 受信欄更新
        TextBox2.Text = RecvStr

        ' 受信履歴更新
        RichTextBox1.Text = RichTextBox1.Text + RecvStr + vbCr

        ' 受信履歴の最下行表示
        RichTextBox1.SelectionStart = RichTextBox1.Text.Length - 1
        RichTextBox1.ScrollToCaret()
    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Dim Recv As New RecvDataDelegate(AddressOf RecvData)
        Dim strReceived As String

        Try
            ' 受信データ読込
            strReceived = SerialPort1.ReadExisting()

            ' 受信文字列結合
            TempStr = TempStr + strReceived

            ' CR受信(受信完了)
            If strReceived(strReceived.Length - 1) = vbCr Then
                ' CR削除
                TempStr = TempStr.Remove(TempStr.Length - 1, 1)

                ' TextBox1からInvoke
                TextBox1.Invoke(Recv, TempStr)

                ' 一時文字列初期化
                TempStr = ""
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, "受信エラー", _
                MessageBoxButtons.OK, _
                MessageBoxIcon.Error, _
                MessageBoxDefaultButton.Button3)
        End Try

    End Sub

End Class

   Public b8_flag As Integer = 0

    Dim startTime As DateTime
    Dim ts As TimeSpan

Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click

        Dim startDt As DateTime = DateTime.Now

        If b8_flag = 0 Then
            Button8.Text = "測定停止"

            With ToolStripStatusLabel1
                .Text = "測定中"
                .BackColor = Color.Yellow
            End With
            ToolStripStatusLabel2.Text = "測定時間:00:00:00"
            startTime = DateTime.Now
            Threading.Thread.Sleep(100)
            Timer2.Start()

            b8_flag = 1
        Else
            With ToolStripStatusLabel1
                .Text = "測定停止"
                .BackColor = SystemColors.Control
            End With

            sw.Stop()

            Timer2.Enabled = False
            'ToolStripStatusLabel2.Text = "測定時間:00:00:00"

            b8_flag = 0
        End If
    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        ToolStripStatusLabel2.Text = "測定時間:" & sw.Elapsed.Hours.ToString("00") & ":" & sw.Elapsed.Minutes.ToString("00") & ":" & sw.Elapsed.Seconds.ToString("00")
        ts = Now.Subtract(startTime)    ' 経過時間算出
        ToolStripStatusLabel4.Text = "経過時間:" & ts.TotalMinutes.ToString

        ts = DateTime.Now - startTime
        ToolStripStatusLabel4.Text = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds)

    End Sub

    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
        Dim fc As Double = 9700
        Dim startF60, startF40, stopF40, stopF60 As Double
        Dim startF60dB, startF40dB, stopF40dB, stopF60dB As Double
        Dim t As Double = 22.994
        Dim tr As Double = 0.024

        'tr = Int(t / 10) * 10

        Dim db40width As Double = 7.6 / Math.Sqrt(t * 10 ^ -6 * tr * 10 ^ -6)

        Dim db60 As Double = -60

        Dim db60witdh As Double = db40width * 10 ^ (-(db60 + 40) / 10 / 3)

        startF60 = fc - (db60witdh*10 ^ -6) / 2
        stopF60 = fc + (db60witdh*10 ^ -6) / 2
        startF40 = fc - (db40width*10 ^ -6) / 2
        stopF40 = fc + (db40width*10 ^ -6) / 2

        startF60dB = -40 + -30*Math.Log10((fc - 9677) / (db40width*10 ^ -6 / 2))
        startF40dB = -40
        stopF40dB = -40
        stopF60dB = -40 + -30*Math.Log10((9723 - fc) / (db40width*10 ^ -6 / 2))

        MessageBox.Show("40dB帯域幅:" & db40width & vbCrLf &
            "60dB帯域幅:" & db60witdh & vbCrLf &
                        "startF60:" & startF60 & vbCrLf &
                        "startF40:" & startF40 & vbCrLf &
                        "stopF40:" & stopF40 & vbCrLf &
                        "stopF60:" & stopF60 & vbCrLf &
                        "startF60の振幅:" & startF60dB & vbCrLf &
                        "startF60の振幅:" & startF40dB & vbCrLf &
                        "startF60の振幅:" & stopF40dB & vbCrLf &
                        "startF60の振幅:" & stopF60dB & vbCrLf)
    End Sub

メモ2

'*******************************************************************************************************
'マスク値の計算
Function CalcMaskData(Freq As Double) As Double
    
    '60dB境界下限周波数より低い場合
    '60dB境界上限周波数より高い場合
    If Freq <= StartF60 Or Freq >= StopF60 Then
        CalcMaskData = (-60dB or 43+10log(PEP))
    End If
    
    '40dB帯域内の場合
    If Freq >= StartF40 And Freq <= StopF40 Then
        CalcMaskData = 0
    End If
    
    '60dB境界下限周波数~40dB境界下限周波数の場合
    If Freq > StartF60  And Freq < StartF40  Then
    '   CalcMaskData = -40 - 30 * Log(2 * (CenterF - Freq) / D40Width) / Log(10)
  'D40Width:40dB帯域幅
        CalcMaskData = -40 - 30 * (0.6931 + Log(CenterF - Freq) - lnD40Width) / 2.3026
    End If
    
    '40dB境界上限周波数~60dB境界上限周波数の場合
    If Freq < StopF60  And Freq > StopF40  Then
'        CalcMaskData = -40 - 30 * Log(2 * (Freq - CenterF - OffsetF) / D40Width) / Log(10)
        CalcMaskData = -40 - 30 * (0.6931 + Log(Freq - CenterF) - lnD40Width) / 2.3026
    End If
    
    Exit Function

End Function
'******************************************************************************************
【マスクデータの生成について】 
マスクデータを生成する際、周波数点は以下のようにしています。 
①下記の周波数点は必ず生成されるようにしています。 
 ・40dB 帯域幅の上限下限の周波数点 
   マスクデータ = 0dB 
 ・40dB 帯域幅の上限+0.001 Hz、下限-0.001 Hz の周波数点 
   マスクデータ = -40dB 
 ・帯域外領域とスプリアス領域の境界周波数 
   マスクデータ = 43+10log(PEP)か-60dBのどちらか小さい方

②帯域外領域とスプリアス領域の境界周波数内のマスクデータ計算周波数点は
 40 dB 帯域幅内を含めて、参照帯域幅の Step で生成されます。 

③測定開始周波数から帯域外領域とスプリアス領域の境界周波数の下側までの周波数点は 
 5 点程度になるように生成しています。 

④帯域外領域とスプリアス領域の境界周波数の上側から測定終了周波数までの周波数点は 
 5点程度になるように生成しています。 

'****************************************************************************************
【分かったこと】
・電力5W以下は43+10log(PEP)の方が小さい
・スプリアスのATTは入力レベルの適正、通常は内部回路の保護のため最低でも10dBは入れておく
 →尖っていない方だけ変化する。低いほど低い、大きいほど高い。

メモ

①フォーム閉じる時の保存確認を排除
②セッティング保存ボタンを設ける
③パルス特性の結果を反映させるテキストボックスを用意する
 →40dB帯域幅にも反映させる
④電力測定後、PEPに反映させる(空中線電力)
⑤規格線作成

【短パルス選択時】
●下記の定数/値を取得する(初期設定)
・中心周波数
・40dB帯域幅
・測定周波数範囲下限(開始周波数)[MHz]
・測定周波数範囲上限(終了周波数)[MHz]
・オフセット周波数[MHz]
・参照帯域幅[MHz]
・減衰曲線(30dB/decade)
・空中戦電力[W]

●結果を入れておくといい
・帯域外領域とスプリアス領域との境界 下側
・40dB帯域幅 下側
・40dB帯域幅 上側
・帯域外領域とスプリアス領域との境界 上側

●参照帯域幅(スプリアス領域で測定する周波数帯ごとに定義される)計算
 入力値:(ユーザー)[MHz]
 選択:1MHz固定、指定値、
    非符号化パルス変調(固定周波数):1/パルス幅[us]
    位相変調符号化パルスレーダー(固定周波数):1/移送変調チップ長[us]
    周波数変調及びチャープレーダ:√(周波数偏移幅[MHz]/パルス幅[us])

③規格線作成
dim LimitNo as long
dim MaskFreq() as double
dim MaskLimit() as double

LimitNo = 0
Erase MaskFreq
Erase MaskLimit

・ステップ周波数(-60dBのポイント数を減らす式)  
    TempF = Int*1
    End If
    
    '40dB帯域内の場合
    If Freq >= StartF40 And Freq <= StopF40 Then
        CalcMaskData = 0
    End If
    
    '60dB境界下限周波数~40dB境界下限周波数の場合
    If Freq > StartF60  And Freq < StartF40  Then
    '   CalcMaskData = -40 - 30 * Log(2 * (CenterF - Freq) / D40Width) / Log(10)
  'D40Width:40dB帯域幅
        CalcMaskData = -40 - 30 * (0.6931 + Log(CenterF - Freq) - lnD40Width) / 2.3026
    End If
    
    '40dB境界上限周波数~60dB境界上限周波数の場合
    If Freq < StopF60  And Freq > StopF40  Then
'        CalcMaskData = -40 - 30 * Log(2 * (Freq - CenterF - OffsetF) / D40Width) / Log(10)
        CalcMaskData = -40 - 30 * (0.6931 + Log(Freq - CenterF) - lnD40Width) / 2.3026
    End If
    
    Exit Function

End Function
'******************************************************************************************
【マスクデータの生成について】 
マスクデータを生成する際、周波数点は以下のようにしています。 
①下記の周波数点は必ず生成されるようにしています。 
 ・40dB 帯域幅の上限下限の周波数点 
   マスクデータ = 0dB 
 ・40dB 帯域幅の上限+0.001 Hz、下限-0.001 Hz の周波数点 
   マスクデータ = -40dB 
 ・帯域外領域とスプリアス領域の境界周波数 
   マスクデータ = 43+10log(PEP)か-60dBのどちらか小さい方

②帯域外領域とスプリアス領域の境界周波数内のマスクデータ計算周波数点は
 40 dB 帯域幅内を含めて、参照帯域幅の Step で生成されます。 

③測定開始周波数から帯域外領域とスプリアス領域の境界周波数の下側までの周波数点は 
 5 点程度になるように生成しています。 

④帯域外領域とスプリアス領域の境界周波数の上側から測定終了周波数までの周波数点は 
 5点程度になるように生成しています。 

'****************************************************************************************
【分かったこと】
・電力5W以下は43+10log(PEP)の方が小さい
・スプリアスのATTは入力レベルの適正、通常は内部回路の保護のため最低でも10dBは入れておく
 →尖っていない方だけ変化する。低いほど低い、大きいほど高い。

以上

*1:StartF60 - StartF) / 20)
    Select Case TempF 
        Case Is < 1:            StepNegF = 0.1
        Case Is < 10:           StepNegF = Int(TempF)
        Case Is < 100:          StepNegF = Int(TempF / 10) * 10
        Case Is < 1000:         StepNegF = Int(TempF / 100) * 100
        Case Is < 10000:        StepNegF = Int(TempF / 1000) * 1000
        Case Else:              StepNegF = 10000
    End Select
    
    TempF= Int((StopF - StopF60) / 20)
    Select Case TempF
        Case Is < 1:            StepPosF = 0.1
        Case Is < 10:           StepPosF = Int(TempF)
        Case Is < 100:          StepPosF = Int(TempF / 10) * 10
        Case Is < 1000:         StepPosF = Int(TempF / 100) * 100
        Case Is < 10000:        StepPosF = Int(TempF / 1000) * 1000
        Case Else:              StepPosF = 10000
    End Select

 '①startF~StartF60
I = 1
Do While Integer.Parse(StartF + (I - 1) * StepNegF) < StartF60
 If I = 1 Then
  Freq = StartF
 Else
  Freq = Integer.Parse(StartF + (I - 1) * StepNegF)
 End If
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
 LimitNo = LimitNo + 1
 I = I + 1
Loop

'②StartF60~StartF40
I = 1
Do While (StartF60 + (I - 1) * BWref < StartF40
 'BWref:参照帯域幅[MHz]
    Freq = StartF60 + (I - 1) * BWref 
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
 LimitNo = LimitNo + 1
    I = I + 1
Loop

'③StartF40
Freq = StartF40
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
LimitNo = LimitNo + 1

'④StartF40~StopF40
I = 1
Do While (StartF40) + (I - 1) * BWref < StopF40
    Freq = (StartF40) + (I - 1) * BWref
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
 LimitNo = LimitNo + 1
 I = I + 1
Loop

'⑤StopF40
Freq = StopF40
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
LimitNo = LimitNo + 1


'⑥StopF40~StopF60
I = 2
Do While (StopF40) + (I - 1) * BWref < StopF60
    Freq = (StopF40) + (I - 1) * BWref
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
    LimitNo = LimitNo + 1
    I = I + 1
Loop

'⑦StopF60 ~ F_Stop
I = 1
Freq = (StopF60) + (I - 1) * StepPosF
Ret = SetMaskData(LimitNo, Freq)
LimitNo = LimitNo + 1

I = 2
Do While (StopF60) + (I - 1) * StepPosF < StopF
    Freq = Integer.Parse(StopF60) + (I - 1) * StepPosF
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
 LimitNo = LimitNo + 1
    I = I + 1
Loop

 MaskFreq(LimitNo)=StopF
 MaskLimit(LimitNo)=CalcMaskData(Frep)


'*******************************************************************************************************
'マスク値の計算
Function CalcMaskData(Freq As Double) As Double
    
    '60dB境界下限周波数より低い場合
    '60dB境界上限周波数より高い場合
    If Freq <= StartF60 Or Freq >= StopF60 Then
        CalcMaskData = (-60dB or 43+10log(PEP

VBA ExcelでWordのテキストボックス内の文字列に取り消し線を表示させる

Sub EXCEL_WORD02() 'EXCEL VBAから既存のWORDファイルを起動する。
 
    Dim WordApp As Object
    Dim WordDoc As Word.Document
                            '
    Set WordApp = CreateObject("Word.Application") ' CreateObject関数でWordをセット
 
    WordApp.Visible = True 'Wordを起動する
  
    Set WordDoc = WordApp.Documents.Open("C:\Users\sannp\OneDrive\デスクトップ\test01.docx") ' 指定したWordファイルを起動します。
 
    Dim srcText As String
    srcText = "なおき"
     
    Dim shp As Object  ' Word.Shape
 
    For Each shp In WordApp.ActiveDocument.Shapes
        If shp.Type = msoTextBox Then
            Call DoubleStrikeText(shp, srcText)

        End If
    Next
    
End Sub

 

Public Sub DoubleStrikeText(shp As Variant, srcText As String)
    
    If shp.TextFrame.HasText Then
        Dim objFind As Find
        Set objFind = shp.TextFrame.TextRange.Find
        
        objFind.ClearFormatting
        objFind.Forward = True
        objFind.Text = srcText
        objFind.Replacement.Font.DoubleStrikeThrough = True
        Call objFind.Execute(Replace:=wdReplaceAll)
        
    End If
End Sub